JVM 시리즈 - 심층 JVM 메모리 영역의 이해

머리말

자바 .class에 의해 가상 머신, JVM 내부 메모리에 클래스 로더가로드를 통해 파일은 가상 머신, 또는 컴파일 구현에 의해 실행 구문 분석. JVM의 관리를 용이하게하기 위해로드 온 .class내용을, Java 가상 머신 런타임 데이터 영역의 개념. Java 가상 머신 런타임 데이터 영역 전용 스레드들로 분할 될 수 있고, 스레드 프로그램 카운터 스레드 전용 가상 머신 스택 원시 메소드 스택을 포함하고, 데이터 영역의 두 가지 유형을 공유하고, 스레드 자바 힙, 메소드 영역을 포함한 공유한다.

는 "힙"두 부분의 "스택"으로 나누어 심층 JVM, 자바 런타임의 이해를 우리는 종종 대단위됩니다 데이터 영역의 부재에서 "힙"인스턴스화 된 객체를 저장하는 데 사용되며, "스택"을 사용 객체 참조를 저장합니다. JVM을에 우리의 심도있는 연구로, 우리는인지 적 학습 자바 런타임 데이터 영역의 초기 단계에서 우리보다 더 JVM 메모리의 부문은 복잡 할 것으로 나타났다. C / C ++ 프로그래머는 자바에있는 동안, 가상 기계가 자동으로 우리가 자원이 JVM 런타임 메모리를 이해하기 위해 우리를 필요로하는, 사용하지 않아도 되 찾을 수 있도록, 재사용 메모리 공간을 필요로하지 않는 수동으로 해제 프로그램 필요 부문은, 우리가 프로그램에 대한보다 깊은 이해를 도움이 될 것입니다.

상세 데이터 영역

프로그램 카운터

프로그램 카운터 (프로그램 카운터 레지스터)는 상대적으로 작은 데이터 영역입니다. 자바 멀티 스레드 지원이므로, 즉, 각각의 스레드를 다시 얻기 위해 스레드 메모리 공간, 현재 스레드 스위칭 (구내 파괴)는 현재 바이트 코드의 실행 라인 번호의 기록 시간이 필요 이내 시간 CPU 실행 시간으로 바이트 코드는 다음 (사이트 복원을) 계속 행의 마지막 번호를 실행할 수 있습니다. 그리고 프로그램 카운터 제안, 현재의 thread 번호의 실행 바이트 코드 행 수를 기록하는 것입니다.

파서 바이트 코드는 바이트 코드 명령의 실행에 따라 선택 카운터의 값을 해결하기 위해 필요하다. 순환 자바 코드, 점프, 예외 처리, 스레드 회복과는 너무 완벽에 카운터에 의존 할 필요가있다.

스레드 자바 메소드를 실행하는 경우, 카운터는, 가상 머신 바이트 코드 명령의 어드레스가 실행되는 기록,이 카운터의 값은 널 (미정의) 인 경우, 기본 방법으로 수행되고있다. 프로그램 카운터는 하나의 JVM은 어떤 지역 OOM 상황을 제공하지 않는 것입니다.

VM 스택

가상 머신 스택 (Java 가상 머신 스택)도 스레드 개인의 라이프 사이클과 동일한 스레드입니다. 가상 머신 스택 메모리 모델 자바 실행 방법을 설명한다 : 각각의 스택 프레임을 생성하기 위해 자바 메소드를 실행 한 후 프레임을 스택 할이 시스템은 가상 머신 스택을 밀었다. 스택 프레임은 로컬 변수 테이블 오퍼랜드 스택, 동적 링크에있어서 출구 (방법 복귀 어드레스)뿐만 아니라 부가적인 정보들로 분할 될 수있다. 밀고 가상 머신 스택 프레임 터지는 과정 자바 실행 방법에 대응한다.

  • 로컬 변수 테이블이 실행되는 동안 로컬 변수의 주요 방식으로 저장된다. 여덟 개의 기본 유형, 로컬 변수는 프로세스 정의.

  • 오퍼랜드 스택 피연산자에 저장된다. 오퍼랜드 스택 데이터 구조가 스택 구조 인, 요소의 스택 자바 데이터 타입 일 수있다. 행하는 스택 공간 프레임을 할당하는 방법을 개시하는 경우는 오퍼랜드 스택 누름을 수행 할 때, 수행 방법에있어서 로컬 변수의 조작 / 조작 팝업되면, 오퍼랜드 스택은 비어있다.

  • 주요 역할은 (런타임을 결정하기 위해 필요 클래스 로딩 방식) 다형성에게 자바 언어를 연결 지원 동적, 동적이다.

  • 방법은 반환 된 주소가 복귀 방법의 결과를 반환합니다. 정상 복귀하면, 프로그램 카운터는 리턴 어드레스로서 전화이다 예외가 반환되는 경우,이 예외 처리기 테이블에 의해 결정된다 (비 스택 프레임)이다.

동시에, Java 가상 머신 스펙은 가상 머신 스택이이 개 이상을 가지고 정의 :

이상 정의
StackOverflowError가 상기 스택 깊이는 가상 머신의 깊이가 정의 현재 스택 프레임의 시작을 요청 넘으면 스택 프레임 예외
OutOfMemoryError를 가상 머신 동적 런타임에 스택 메모리를 적용 할 경우, 때 자바 가상 머신은 스택 메모리 예외 이상으로 적용 할 수 없습니다

네이티브 메소드 스택

역할을하지만, 가상 머신 스택 메모리는 메모리 공간을 제공하는 자바 네이티브 메소드에 비해 일반적인 방법 Java 및 네이티브 메소드 스택을위한 공간을 제공하는 가상 머신 스택 네이티브 메소드 스택 (기본 방법 스택)과 매우 유사. 따라서, 하나의 스택에 가상 머신과 네이티브 메소드 스택에 직접적으로 일 핫스팟 가상 머신과 같은 일부 가상 머신.

동시에, 네이티브 메소드 스택 및 스택은 가상 머신으로도 던질 수있는 StackOverFlowError, OutOfMemoryError예외의 두 종류.

Java 힙

Java 가상 머신의 힙 메모리 공간의 가장 큰 부분이지만, 또한 메모리 영역이 각 스레드에 의해 공유 할 수 있습니다. Java 힙은 가상 머신이 생성되면, 그 주된 목적은, 데이터의 배열을 오브젝트 인스턴스를 저장하기 위해 생성된다. JIT 컴파일러의 발전과 함께, 탈출 분석 기술의 개발은 이러한 개체는 스택에 할당 할 수 있습니다.

자바 힙 주 영역의 GC 가비지 콜렉션입니다. 메모리 복구의 관점에서, 주로 자바 힙 년 된, 새로운 세대의 새로운 세대로 나눌 수 있습니다 에덴 공간으로 나눌 수 있습니다 생존자 Survice 공간 세대 수집 알고리즘에서 Java 힙 및 걸릴 때문에.

공유 메모리의 관점에서, Java 힙 여러 스레드로 나눌 수 있습니다 (로컬 할당 버퍼, TLAB 스레드) 할당 된 버퍼를 공유 할 수 있습니다.

가상 시스템 사양은 자바 스택은 불연속 실제 메모리, 그리고 논리적으로 연속으로 할 수있다. 동시에, 힙 할당의 힘을 완료 할 수 없습니다 및 가상 머신이 발생합니다, 더 많은 시간을 힙에 적용 할 수없는 OutOfMemoryError예외를.

가상 머신에서 기본 개체 인스턴스는 Java 힙을 할당하는 것입니다, 다음과 같이 메모리 레이아웃 객체 인스턴스는 다음과 같습니다

메모리 레이아웃 객체 인스턴스는 세 부분으로 구성된다 : 객체 헤더 (헤더)의 데이터 인스턴스 (인스턴스), 정렬 심 (패딩).

  • 두 핫 스폿 정보의 조각을 포함 객체 헤더 (헤더) 런타임 데이터를 저장하기위한 수단은, 포인터의 유형 객체 자체. 위와 같이 런타임 데이터 자체를 저장하는 제 1 부와; 그리고 섹션 포인터의 두번째 유형의 메타 데이터 객체, 즉 포인터를 가상 컴퓨터는 물체에 의해 결정되는 자신이 속한 클래스 포인터있다. 검색의 대상이 반드시 메타 데이터 개체 자체 (반사)에 의해 요구되지 않기 때문에 그러나, 가상 머신의 모든 유형은, 위의 개체 헤더 데이터에 대한 포인터를 유지해야합니다.

  • 데이터 부분의 예는 유효 물체 실제로 자바 소스 등의 분야에서 콘텐츠의 다양한 형태로 정보를 저장 정의되는 상위 클래스의 데이터 콘텐츠를 포함 상속. 동시에 당신은 할당 전략은 인스턴스 데이터 저장 부 순서로 자바 소스 코드에서 가상 머신 (FieldsAllocationStyle) 및 필드에 영향을받을 수 있습니다.

  • 정렬 패딩 반드시 레이아웃 객체 인스턴스에 존재하지, 특별한 의미는 없다. 자동 메모리 관리 시스템은 물체의 필요성 가상 머신의 크기가 필요하기 때문에 8 바이트의 정수 배수 여야합니다. 오브젝트 헤더 크기는 정확히 8 바이트의 배수 인 (1 배 또는 2 배)에는 인스턴스 데이터 정렬, 그 충전 완료를 정렬 할 필요가없는 경우.

힙의 예는 Java 오브젝트에 저장된 오브젝트는 오브젝트 액세스하는 데 사용되는 자바 프로그램은 로컬 스택 변수 테이블에서 가상 머신 힙 특정 기준 데이터 객체를 조작 할 필요가 있었다. 현재 주류 접근 방법은 핸들을 사용하여 직접 포인터 두 종류가있다.

동시에, Java 힙은 던질 수있는 OutOfMemoryError예외를.

방법 지구

각 스레드 스토어 클래스 정보는 상기 가상 머신에 로딩되어 사용되는 공유 메모리 영역이 그대로 구역 방법 (방법 지역)와 Java 힙은 상수, 정적 변수, 시간 컴파일러 영역에서 GC를 코드 및 다른 데이터를 컴파일 상대적으로 작은 나타납니다. 한편, 상기 방법은 런타임 상수 풀 영역을 포함한다.

클래스가로드 된 후에 컴파일 생성 된 레퍼런스를 저장하기위한 다양한 기호 및 런타임 리터럴 상수 풀은이 섹션은 항상 휴대 기억 영역의 양의 운전 방법을 입력한다.

  • 다양한 문자와 자바와 유사한 개념 수준의 언어는, 최종 등등 상수로 선언 된 텍스트 문자열을 포함;

  • 부호있어서 완전한 클래스 이름 및 인터페이스 이름 디스크립터 디스크립터에있어서, 상기 필드의 이름;

한편, 지구 방법은 던질 수있는 OutOfMemoryError예외를.

개요

JVM이 실행 자바를 포함하여 위, .classJVM을에로드 지역은 각각 스레드와 스레드가 개인 영역을 공유 나누었다. 물론,이는 또한 마커의 자바 JVM 가비지 힙뿐만 아니라, 가비지 컬렉션을 알 필요는 JVM의 과정의 작은 단계에 대한 심층적 인 지식입니다 ......

추천

출처juejin.im/post/5e761f74e51d45270f52e22d