2장. 자바 메모리 영역과 메모리 오버플로
2.2. 런타임 데이터 영역

2.2.1 프로그램 카운터
- 현재 실행중인 스레드의 ‘바이트코드 줄 번호 표시기’
- 바이트코드 인터프리터는 이 카운터의 값을 바꿔 다음에 실행할 바이트코드 명령어를 선택하는 식으로 동작한다.
- 자바 가상 머신에서의 멀티스레딩은 CPU 코어를 여러 스레드가 교대로 사용하는 방식으로 구현되기 때문에,
특정 시각에 각 코어는 한 스레드의 명령어만 실행하게 된다.
따라서 스레드 전환 후, 이전에 실행하다 멈춘 지점을 정확하게 복원하려면, 스레드 각각에는 고유한 프로글
- 각 스레드의 카운터는 서로 영향을 주지 않는 독립된 영역에 저장된다.
- 스레드가 자바 메서드를 실행 중일 때는 실행중인 바이트코드 명령어의 주소가 프로그램 카운터에 기록된다.
2.2.2 자바 가상 머신 스택
- 연결된 스레드와 운명을 같이 한다(생성/삭제 시기가 일치한다)
- 자바 메서드를 실행하는 스레드의 메모리 모델을 설명해 준다.
- 각 메서드가 호출될 때마다 자바 가상 머신은 스택 프레임을 만들어 지역 변수 테이블, 피연산자 스택, 동적 링크, 메서드 반환값 등의 정보를 저장한다.
- 그런 다음 스택 프레임을 가상 머신 스택에 푸시(push)하고, 메서드가 끝나면 팝(pop)하는 일을 반복한다.
- 바의 메모리 영역을 힙 메모리와 스택 메모리로 구분하는 사람이 많다.
하지만 자바의 메모리 영역 구분은 훨씬 복잡하다.
- 개발자들이 가장 신경 써야 할 영역이라는 방증.
- '스택'이라고 하면 보통 방금 이야기한 자바 가상 머신 스택을 가리키는데, 그중 특히 지역 변수 테이블을 가리킬 때가 많다.
- 지역 변수 테이블에는 자바 가상 머신이 컴파일타임에 알 수 있는 다양한 기본 데이터 타입, 객체 참조, 반환 주소 타입을 저장한다. 지역 변수 테이블에서 이 데이터 타입들을 저장하는 공간을 지역 변수 슬롯이라 한다. 일반적으로 슬롯 하나의 크기는 32비트다.
- 지역 변수 테이블을 구성하는 데 필요한 데이터 공간은 컴파일 과정에서 할당된다.
- 오류 발생
- StackOverflow
- OOM은 핫스팟VM에서는 발생하지 안흔ㄴ다.
2.2.3 네이티브 메서드 스택
- (가상 머신 스택은 자바 메서드(바이트코드)를 실행할 때 사용하고,)
네이티브 메서드 스택은 네이티브 메서드를 실행할 때 사용한다.
- 네이티브 메서드 스택과가상 머신 스택을 하나로 합쳐 놓은 가상 머신도 있다(핫스팟 가상 머신 포함)