머리말
Java 메모리 영역은 주로 프로그램 카운터, Java 가상 기계 스택, 로컬 메소드 스택, Java 힙, 방법 영역 및 런타임 상수 풀로 구성됩니다. 이 기사는 Java 메모리 영역의 부서 및 예외에 대해 자세히 소개합니다. 아래에서 많이 말하지 않겠습니다. 자세한 소개를 함께 살펴 보겠습니다.
런타임 데이터 영역
JVM이 Java 프로그램을 실행하면 메모리를 여러 다른 데이터 영역으로 나눕니다.
프로그램 카운터
스레드 비공개. 현재 스레드에 의해 실행 된 바이트 코드의 줄 번호 표시기로 간주 될 수 있습니다. 바이트 코드 통역사의 작업은이 카운트 값을 변경하여 실행될 다음 바이트 코드 명령을 읽는 것입니다.
다중 스레딩은 스레드를 차례로 전환하고 프로세서 실행 시간을 할당함으로써 달성됩니다. 언제든지 커널은 한 스레드에서만 지침을 실행할 수 있습니다. 스레드 전환 후 올바른 실행 위치로 복원하려면 각 스레드에는 독립 프로그램 카운터가 필요합니다. 이것이 "스레드 개인"의 시작 부분에서 언급 한 것입니다. 스레드가 실행되는 메소드가 Java 메소드 인 경우 카운터는 가상 머신 바이트 코드의 명령어 주소를 기록합니다. 기본 방법 인 경우 카운터 값이 비어 있습니다. 프로그램 카운터는 Java Virtual Machine 사양에 OOM (OutofMemoryError) 상황이 지정되는 유일한 영역입니다.
Java 가상 기계 스택
스레드는 비공개이며 스레드와 같은 수명주기입니다. Java Virtual Machine 스택은 Java 메소드의 메모리 모델을 설명합니다. 각 방법은 실행될 때 스택 프레임을 생성하고 로컬 가변 테이블, 오페라 스택, 동적 링크 및 메소드 종료 정보를 저장합니다. 호출에서 끝까지, 각 메소드는 가상 머신 스택 에서이 스택 프레임의 스택 입력 및 종료 프로세스에 해당합니다. 로컬 변수 테이블은 다양한 기본 데이터 유형 (int, double, char, byte 등), 객체 참조 (객체 자체가 아님) 및 returnAddress 유형 (바이트 코드 주소를 포인트)을 저장합니다.
이 영역에서 두 가지 가능한 예외 :
로컬 메소드 스택
위의 가상 머신 스택은 JVM 용 Java 메소드 서비스를 실행하고 로컬 메소드는 기본 서비스를 실행합니다. 다른 것들은 가상 머신 스택과 유사하며 Stackoverflowerror 및 OutofMemoryError도 던져집니다.
자바 힙
일반적으로 "스택 메모리"및 "힙 메모리"라고 불리우며 전자는 가상 머신 스택을 나타냅니다. 후자는 Java 힙을 나타냅니다. Java 힙은 스레드와 공유됩니다. 가상 머신이 시작될 때 생성됩니다.
자바 힙의 역할은 객체 인스턴스를 저장하는 것입니다. Java 힙은 물리적으로 불연속 메모리 공간에있을 수 있으며 논리적으로 만 연속적으로 만 있으면됩니다.
방법 영역
스레드가 공유하는 영역. 클래스 정보, 상수, 정적 변수, 컴파일러에서 컴파일 된 코드 등과 같은 데이터를 가상 머신에서로드 한 데이터를 저장합니다. 메소드 영역이 메모리 할당 요구 사항을 충족 할 수없는 경우 OutofMemoryError가 발생합니다.
런타임 상수 풀
런타임 상수 풀은 방법 영역의 일부입니다. C는 컴파일 기간 동안 생성 된 다양한 문자 상수 및 상징적 참조를 저장하는 데 사용되며 클래스 로딩 후 방법 영역에 들어가는 런타임 상수 풀에 저장됩니다. Java 언어는 컴파일 기간 동안 만 상수를 생성 할 필요가 없습니다. 다시 말해, 실행 기간 동안 새로운 상수를 배치 할 수 있습니다.
직접 기억
직접 메모리는 가상 머신 런타임 데이터 영역의 일부가 아니며 메모리 영역도 아닙니다. 기본 기계의 직접 메모리 할당은 Java 힙의 크기에 의해 제한되지 않지만 결국 메모리입니다. 각 메모리 영역의 합이 물리적 메모리 한계보다 크면 OutofMemoryError가 여전히 나타납니다.
객체 생성 과정
가상 머신은 "새로운"명령에 직면합니다.
객체의 메모리 레이아웃
메모리에 저장된 물체의 레이아웃은 3 개의 영역으로 나눌 수 있습니다.
객체 헤더 : 해시 코드, GC 생성 연령, 잠금 상태 플래그, 스레드에 의해 고정 된 잠금, 스레드 ID 등과 같은 객체의 자체 런타임 데이터를 저장합니다. 다른 부분은 유형 포인터, 즉 객체의 클래스 메타 데이터에 대한 포인터입니다. 가상 머신은이 포인터를 사용하여 객체가 속한 클래스 인스턴스를 결정합니다.
인스턴스 데이터 : 객체의 진정으로 유효한 정보, 프로그램에 정의 된 다양한 유형의 필드의 내용;
정렬 보충제 : 비 필수, 탑승자의 역할.
객체 액세스 포지셔닝
Java 프로그램은 스택의 참조를 통해 힙의 인스턴스 객체를 작동합니다. 예를 들어
사람 P = 새로운 사람 ();
여기서 P는 참조이며, New가 생성 한 사람 객체는 인스턴스입니다.
이 참조는 힙에있는 객체의 특정 위치를 찾아서 액세스하는 방법을 지정하지 않습니다. 두 가지 주류 액세스 방법이 있습니다.
핸들. 메모리 조각은 핸들 풀로 Java 힙으로 나뉘어지며, 객체의 핸들 주소를 참조하고 핸들에는 객체 인스턴스 데이터 및 유형 데이터가 포함되어 있습니다. 장점은 객체가 움직일 때 핸들의 주소 만 변경하면 참조 자체를 수정할 필요가 없다는 것입니다.
직접 포인터. 객체 주소는 참조에 직접 저장됩니다. 장점은 속도가 더 빠르고 참조가 인스턴스 객체의 주소를 직접 나타내기 때문에 포인터 포지셔닝 작업이 저장됩니다. 이것이 바로 Sun Hotspot이 사용하는 방식입니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.