JAVA 메모리 - 프로그램 카운터 레지스터에 대한 이해

프로그램 카운터 레지스터란

자바에서 사용하는 가상 메모리의 개념 중 하나이다.

프로그램 , 카운터 - 카운팅기능 , 레지스터 - 등록체

 

이렇게 이해할 수 있는데, 프로그램 카운터란 결국

스레드가 실행하면서 가지게 되는 바이트코드의 줄 을 세서, 유지하고 관리하는 개념이다.

 

이를 통해 흐름제어 , 순환 , 점프 ,예외처리 , 스레드 부팅(재시작)을 하게 되는데

 

자바 개발자라면 다들 알고 있다시피 , 자바는 여러개의 CPU를 동시에 사용해

스레드를 병렬처리하게 되는데 이때 우선순위가 주어지게 되고,

 

어떤 특정시점에서 우선해서 다른 스레드를 동작시켰다면, 멈춘 위치를 기억해야하는데

그런 역할을 프로그램 카운터가 하게된다는 것이다.

 

그리고 이러한 영역을 프라이빗한 스레드 영역이라고 하게된다.

그래서 해당 영역에서 문제가 생기면 OUT OF Memory Error 와 같은 문제가 발생해서

어디서 문제가 생겼는지 찾기 어려워진다고 이해해볼 수 있다.

코드를 통해 이해해보자

public class ProgramCounterDemo {
    public static void main(String[] args) {
        // 두 개의 스레드 생성
        Thread thread1 = new Thread(new Task(), "Thread-1");
        Thread thread2 = new Thread(new Task(), "Thread-2");

        // 스레드 시작
        thread1.start();
        thread2.start();
    }
}

class Task implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            // 현재 스레드 이름과 실행 중인 루프 카운터 출력
            System.out.println(Thread.currentThread().getName() + " - Count: " + i);

            // 작업을 수행하고 멈춤 (다른 스레드로 전환 가능)
            try {
                Thread.sleep(500); // 500ms 대기
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName() + " interrupted");
            }
        }
    }
}

간단하게 카운팅하는 스레드를 생생해서 대기 상태로 유지시키게 만들어봤다.

이러면 하다가 멈춰도 기다리고 있는걸 확인할 수 있는데

아래처럼 결과가 발생된다.

Thread-1 - Count: 0
Thread-2 - Count: 0
Thread-1 - Count: 1
Thread-2 - Count: 1
Thread-1 - Count: 2
Thread-2 - Count: 2
Thread-1 - Count: 3
Thread-2 - Count: 3
Thread-1 - Count: 4
Thread-2 - Count: 4

이렇게 프로그램 카운터 레지스터 - 메모리영역을 이해할 수 있다.