Java Virtual Machine-런타임 데이터 영역

JVM 사양은 프로그램 실행 중에 필요한 특정 런타임 데이터 영역을 정의합니다. 그들 중 일부는 JVM이 시작되는 동안 생성됩니다. 다른 것들은 스레드에 로컬이며 스레드가 생성 될 때만 생성됩니다 (그리고 스레드가 파괴 될 때 파괴됩니다). 이들은 아래에 나열되어 있습니다-

PC (프로그램 카운터) 등록

각 스레드에 로컬이며 스레드가 현재 실행중인 JVM 명령어의 주소를 포함합니다.

스택

각 스레드에 대해 로컬이며 메서드 호출 중에 매개 변수, 로컬 변수 및 반환 주소를 저장합니다. 스레드가 허용 된 것보다 더 많은 스택 공간을 요구하면 StackOverflow 오류가 발생할 수 있습니다. 스택이 동적으로 확장 가능한 경우에도 OutOfMemoryError가 발생할 수 있습니다.

더미

모든 스레드간에 공유되며 런타임 중에 생성되는 객체, 클래스의 메타 데이터, 배열 등이 포함됩니다. JVM이 시작될 때 생성되고 JVM이 종료 될 때 파괴됩니다. 특정 플래그를 사용하여 OS에서 JVM이 요구하는 힙의 양을 제어 할 수 있습니다 (나중에 자세히 설명). 성능에 중요한 영향을 미치므로 메모리를 너무 적게 또는 너무 많이 요구하지 않도록주의해야합니다. 또한 GC는이 공간을 관리하고 계속해서 죽은 개체를 제거하여 공간을 확보합니다.

방법 영역

이 런타임 영역은 모든 스레드에 공통이며 JVM이 시작될 때 작성됩니다. 상수 풀 (나중에 자세히 설명), 생성자 및 메서드에 대한 코드, 메서드 데이터 등과 같은 클래스 별 구조를 저장합니다. JLS는이 영역이 가비지 수집되어야하는지 여부를 지정하지 않으므로 JVM은 GC를 무시하도록 선택할 수 있습니다. 또한 이것은 응용 프로그램의 요구에 따라 확장되거나 확장되지 않을 수 있습니다. JLS는 이와 관련하여 어떤 것도 요구하지 않습니다.

런타임 상수 풀

JVM은로드 된 클래스를 링크하는 동안 심볼 테이블 (여러 역할 중 하나) 역할을하는 클래스 별 / 유형별 데이터 구조를 유지합니다.

네이티브 메서드 스택

스레드가 원시 메소드를 호출하면 Java 가상 머신의 구조 및 보안 제한이 더 이상 자유를 방해하지 않는 새로운 세계로 들어갑니다. 네이티브 메서드는 가상 머신의 런타임 데이터 영역에 액세스 할 수 있지만 (네이티브 메서드 인터페이스에 따라 다름) 원하는 다른 작업도 수행 할 수 있습니다.

가비지 컬렉션

JVM은 Java에서 개체의 전체 수명주기를 관리합니다. 개체가 생성되면 개발자는 더 이상 걱정할 필요가 없습니다. 객체가 죽은 경우 (즉, 더 이상 참조가 없음) 직렬 GC, CMS, G1 등 여러 알고리즘 중 하나를 사용하여 GC가 힙에서 객체를 배출합니다.

GC 프로세스 동안 개체는 메모리에서 이동됩니다. 따라서 이러한 개체는 프로세스가 진행되는 동안 사용할 수 없습니다. 프로세스가 진행되는 동안 전체 응용 프로그램을 중지해야합니다. 이러한 일시 중지는 '세계 중지'일시 중지라고하며 엄청난 오버 헤드입니다. GC 알고리즘은 주로이 시간을 줄이는 것을 목표로합니다. 이에 대해서는 다음 장에서 자세히 설명하겠습니다.

GC 덕분에 Java에서 메모리 누수는 매우 드물지만 발생할 수 있습니다. Java에서 메모리 누수를 생성하는 방법은 이후 장에서 살펴볼 것입니다.