[JVM] 객체 만들기, 메모리 레이아웃, 액세스 위치
객체 작성
주로 다음과 같은 몇 가지 절차로 나뉜다
1. 대상에 대응하는 클래스가 불러오는지 확인
가상 머신이 new 명령을 만났을 때, 이 명령의 매개 변수가 상수지에서 하나의 종류의 기호 인용을 찾을 수 있는지 확인하고, 이 기호 인용이 대표하는 클래스가 불러오고, 해석되고, 초기화되었는지 확인하십시오.없으면, 클래스의 불러오는 과정을 먼저 실행합니다.
2. 신입생 대상의 메모리 분배
대상에 필요한 메모리 크기는 클래스가 불러온 후에 완전히 확정할 수 있습니다. 이 때 실행할 때 데이터 영역의 무더기에서 특정 크기의 메모리를 구분해서 대상에게 주어야 합니다.
Thread Local Allocation Buffer
,TLAB라고 한다.메모리를 분배할 라인은 어느 라인의 TLAB에 분배하고 TLAB가 다 쓰고 새로운 TLAB를 분배할 때만 동기화 잠금이 필요합니다.가상 머신이 TLAB를 사용할지 여부는 -XX:+/-UseTLAB
매개변수를 통해 설정할 수 있습니다.3. 메모리 공간 초기화
할당된 메모리 공간을 모두 0값으로 초기화합니다. 이 단계는 대상의 실례 필드가 자바 코드에서 초기 값을 부여하지 않고 바로 사용할 수 있고 프로그램이 이 필드의 데이터 형식에 대응하는 0값에 접근할 수 있도록 합니다.
public class ObjectInit {
private String s;
private int a;
@org.junit.Test
public void test(){
int b;
String s1;
System.out.println(s); ---1
System.out.println(a);-----2
//System.out.println(b);----3
//System.out.println(s1);---4
}
}
위의 코드는 정상적으로 실행되며, 최종적으로null과 0을 출력합니다.만약 3, 4가 표시된 두 개의 코드를 주석을 제거하면test() 방법을 실행하면 알림
java: b s1
이 표시됩니다.4. 객체 설정
예를 들어 이 대상이 어떤 종류의 실례인지, 어떻게 해야 클래스의 메타데이터 정보를 찾을 수 있는지, 대상의Hash코드, 대상의 GC분대 연령 정보 등이다.이 정보는 대상의 대상 헤더에 저장된다.
5. 객체 초기화
위의 작업이 끝난 후에 새로운 대상이 생겼지만 모든 필드는 0입니다.일반적으로 new 명령을 실행한 후에 실행 방법에 따라 대상을 프로그래머의 설정에 따라 초기화합니다.이때, 진정으로 사용할 수 있는 대상이 완전히 발생한다.
객체의 메모리 레이아웃(HotSpot 가상 시스템의 경우)
대상이 메모리에 저장된 레이아웃은 대상 헤드, 실례 데이터, 정렬 채우기 세 개의 영역으로 나눌 수 있다.
저장 내용
표지 위치
잠기지 않음
대상 해시 코드, 대상 세대별 연령
01
경량급 잠금
자물쇠를 가리키는 지침
00
헤비급 잠금
중량급 자물쇠를 가리키는 바늘
10
GC 태그
정보를 기록하지 않음
11
편향 가능
편향 스레드 ID, 편향 시간 스탬프, 대상 세대 구분 연령
01
주: 이곳의 잠금과 편향은 라인이 이 대상을 경쟁할 때의 개념에 속한다.
longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers)
입니다.같은 폭의 필드는 항상 분배 정책에 따라 함께 분배됩니다.이 전제를 충족시키는 조건하에서 부류에 정의된 변수는 항상 자류 앞에 나타난다.CompactFields 매개 변수가true(기본값true)라면 하위 클래스의 좁은 변수도 부모 클래스의 빈틈에 삽입될 수 있습니다.객체에 대한 액세스 위치 지정
대상을 만들면 창고의reference 데이터를 통해 쌓인 구체적인 대상을 조작합니다.가상 기기 규범에서reference 형식 데이터는 지향 대상의 인용이지만, 이 인용은 어떻게 위치를 정하고, 액세스 더미의 대상의 구체적인 위치를 정하는지는 가상 기기가 실현하는 것이다.현재 주류의 접근 방식은 핸들과 직접 지침 두 가지를 사용하는 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.