Java 기본 튜토리얼이 칼럼에서는 JVM이 객체를 생성하고 위치에 액세스하는 과정을 소개합니다
관련 무료 학습 권장 사항: Java Basic Tutorial
1. 가상 머신이 수신할 때 새로운 명령을 실행하려면 이 명령이 상수 풀에서 클래스의 기호 참조를 찾을 수 있는지 확인하고 이 기호 참조가 나타내는 클래스가 로드, 확인 및 초기화되었는지 확인하세요. 없는 경우 먼저 클래스 로딩 프로세스를 수행하십시오.
클래스 로딩이 통과된 후 가상 머신은 새 객체에 메모리를 할당합니다(Java 힙에서 특정 크기의 메모리를 분할). 메모리 크기는 클래스 로딩이 완료된 후에 완전히 결정될 수 있습니다. - 두 가지 할당 방법:
- (1): 포인터 충돌: Java 힙의 메모리가 절대적으로 규칙적이라고 가정합니다. 즉, 사용된 메모리는 한쪽에 있고 사용 가능한 메모리는 다른 쪽에 있으며 포인터는 포인터를 움직여서 메모리 할당이 중앙에 표시됩니다.
(2): 여유 목록: Java 힙의 메모리가 규칙적이지 않은 경우, 즉 사용된 메모리와 사용 가능한 메모리가 인터리브된 경우 가상 머신은 공간 찾기를 통해 사용 가능한 메모리 블록을 기록하는 목록을 유지해야 합니다. 객체 인스턴스에 메모리를 할당하는 목록입니다. -
- Java 힙이 일반인지 아닌지는 사용된 가비지 컬렉터에 압축 기능이 있는지 여부에 따라 결정됩니다.
가상 머신에서 객체를 생성하는 것은 스레드로부터 안전한 동작이 아닙니다. 객체 A에 메모리가 할당되면 포인터가 수정될 시간이 없었고 객체 B는 원래 포인터를 사용하여 메모리를 할당하는 경우가 발생할 수 있습니다. 두 가지 해결 방법이 있습니다. - (1): 메모리 공간 할당 작업을 동기화합니다. 실제로 가상 머신은 업데이트 작업의 원자성을 보장하기 위해 실패 재시도와 함께 CAS를 사용합니다. 즉, 각 스레드는 Java 힙에 로컬 스레드 할당 버퍼(Thread Loal Allocation Buffer, TLAB)라고 하는 작은 메모리 조각을 미리 할당합니다.
- 메모리 할당이 완료된 후 객체의 인스턴스 필드를 초기값 할당 없이 Java 코드에서 직접 사용할 수 있고 프로그램이 액세스할 수 있도록 할당된 메모리 공간을 0 값으로 초기화해야 합니다. 이 필드의 해당 데이터 유형은 0입니다.
- 객체를 설정하고 객체가 인스턴스인 클래스, 클래스의 메타데이터 정보를 찾는 방법, 객체의 해시 코드, 객체의 GC 생성 연령 등을 객체 헤더에 저장합니다.
-
- 2. 객체의 메모리 레이아웃: 메모리에 저장된 객체의 레이아웃은 객체 헤더(Header), 인스턴스 데이터(Instance Data), 정렬 패딩(Padding)의 세 부분으로 나눌 수 있습니다. 개체 헤더에는 두 부분의 정보가 포함됩니다.
- (1): 해시 코드, GC 생성 기간, 잠금 상태 플래그, 스레드가 보유한 잠금, 편향된 스레드 ID, 편향된 타임스탬프와 같은 개체 자체의 런타임 데이터를 저장합니다. 잠깐, 이 데이터 부분의 길이는 32비트와 64비트 가상 머신에서 각각 32비트와 64비트입니다. 공식적으로는 마크 워드(상태에 따라 자체 저장 공간을 재사용하는 고정되지 않은 데이터 구조)라고 합니다. 물체).
(2): 유형 포인터, 즉 개체의 클래스 메타데이터에 대한 포인터입니다. 가상 머신은 이 포인터를 사용하여 개체가 인스턴스인 클래스를 결정합니다.
인스턴스 데이터: 객체가 실제로 저장하는 유효한 정보, 즉 프로그램 코드에 정의된 다양한 유형의 필드의 내용입니다. 상위 클래스에서 상속되었는지 아니면 하위 클래스 자체에서 정의되었는지 여부를 기록해야 합니다.
정렬 패딩: 반드시 존재하는 것은 아니며 자리 표시자 역할을 합니다. HotSpot VM에서는 개체의 크기가 8바이트의 정수 배수여야 하고 개체 헤더 부분이 정확히 8바이트의 정수 배수여야 하므로 역할을 합니다. 인스턴스 데이터가 정렬되지 않은 경우 패딩을 정렬하여 완료됩니다.
- 3. 객체 액세스 위치: Java는 스택의 참조 데이터(로컬 변수 테이블의 객체 참조)를 통해 힙의 특정 객체를 작동합니다. 참조는 객체에 대한 참조만 지정하고 해당 객체를 찾고 액세스하는 방법을 정의하지 않습니다. 힙에 있는 개체의 위치입니다. 객체 액세스 방법은 Swift로 구현됩니다.
- (1): 핸들 액세스: Java 힙은 메모리 조각을 핸들 풀로 나눕니다. 참조는 객체의 핸들 주소를 저장합니다. 핸들에는 객체 인스턴스 데이터와 유형 데이터의 주소 정보가 포함됩니다.
장점: 참조는 개체가 이동하면 참조가 아닌 핸들의 인스턴스 데이터 포인터만 변경됩니다.
(2): 직접 포인터: 참조에 저장된 객체 주소는 Java 힙에 있는 객체 유형 데이터(메소드 영역에 저장됨)의 주소입니다.
이점: 더 빠르고 포인터 위치 지정에 소요되는 시간을 절약합니다. HotSpot은 직접 포인터 액세스를 사용합니다.
위 내용은 JVM 객체 생성 및 접근 위치 프로세스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!