天蓬老师2017-04-18 10:51:59
얕은 크기를 명확하게 설명하려면 보유 크기를 언급해야 합니다.
얕은 크기: 자체 개체가 차지하는 크기를 나타냅니다.
보유된 크기: 자체 개체의 보유 크기 + 참조 개체의 크기입니다.
두 사람의 계산관계를 좀 더 명확하게 표현할 수 있는 사진을 먼저 빌려보겠습니다.
B의 얕은 사이즈 = B;
B의 유지 크기 = B 얕은 크기 + C 유지 크기 + D 유지 크기;
예를 들기 전에 먼저 힙에 있는 JAVA 객체의 저장소를 이해해야 합니다. 32비트 JVM 가상 머신을 예로 들어 보겠습니다.
JAVA 객체는 힙의 세 부분으로 구성됩니다.
객체 헤더
객체 헤더에는 데이터의 두 부분이 포함됩니다.
하나: 런타임 데이터. 32비트 JVM은 32비트이므로 64비트는 8바이트입니다.
2: 포인터를 입력하세요.
인스턴스 데이터
는 인스턴스 변수를 저장하는 데이터입니다. 변수 유형에는 두 가지 기본 유형의 변수와 참조 변수가 있습니다.
기본 유형 변수가 차지하는 바이트 크기에 대해서는 언급하지 않겠습니다. 참조 변수에 포인터를 저장합니다.
데이터 채우기
객체 저장 공간은 8바이트의 정수배입니다. 객체 헤더 + 인스턴스 데이터가 8바이트의 정수배보다 작으면 채워집니다.
참조 유형 크기에 관해 말하자면, 32비트 가상 머신에서 참조는 4바이트를 차지합니다. 64비트 가상 머신에서 포인터 압축이 활성화되지 않은 경우 참조는 8바이트를 차지합니다.
아래 예시를 바탕으로 설명하겠습니다.
으아악얕은 크기는 인스턴스 변수에 참조가 있는지 여부와 관련이 없으므로 **TestObjSize의 얕은 크기를 먼저 분석합니다.
얕은 크기 = 4바이트(객체 헤더) + 4바이트(타입 포인터) + 4바이트 (int a) + 1byte(boolean b) + 4byte(TestObjSize reference) = 17;**
17은 8의 정수 배수가 아니므로 7바이트의 패딩 데이터가 생성됩니다. 인스턴스의 최종 얕은 크기입니다. TestObjSize 유형의 객체 = 24;
예제에 따르면 obj2 객체의 testObjSize = null,
obj2의 보유 크기 = obj2의 얕은 크기 = 24;
obj1 객체의 testObjSize는 obj2이므로 obj1의 보유 크기 = obj1의 얕은 크기입니다. 크기 + obj2의 보유 크기 = 48;
마지막에 힙 덤프를 첨부하세요!
오류가 있으면 알려주세요.