VisualVM과 힙 덤프와 자바 객체의 메모리 사용량을 계산하는 것은 이론적 접근과 일치하지 않습니다

Mixalis Navridis :

모든 나는 간단한 질문이 제공됩니다. 우리는 하나 개의 클래스가있는 경우 자바 문서와 자바 메모리 개체의 레이아웃에 대한 많은 기사에 따르면 int해당 개체의 총 메모리 소비가 될 것입니다 변수 :

  • 표제 8 바이트
  • INT 4 바이트
  • (전체 최대 8 바이트의 배수 일 라운드) 4 바이트 패딩 = 16 바이트 전체
public class Ab {        
    int b;
}

public static void main(String args[]) throws InterruptedException {
    Ab ab = new AB();  
}  

내 문제는 지금은 힙 덤프의 비주얼 VM 및 모양을 사용할 때이 내가 그 개체의 메모리 소비는 것을 발견 이론적 접근 관찰하는 것입니다 20 바이트 대신에 16 ? 이런 이유는 무엇입니까? 누군가가 나에게 설명 할 수 있습니까?

올렉산드르 Pyrohov :

은 Using 자바 객체 레이아웃 나는 다음과 같은 출력을 받았다 도구 :

 OFFSET  SIZE   TYPE DESCRIPTION        VALUE
      0    12        (object header)    N/A
     12     4    int Ab.b               N/A

Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

그리고 그와 -XX:-UseCompressedOopsVM 옵션 (비활성화 압축 참조)

 OFFSET  SIZE   TYPE DESCRIPTION                                VALUE
      0    16        (object header)                            N/A
     16     4    int Ab.b                                       N/A
     20     4        (loss due to the next object alignment)

Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

Java 환경 :

java version "11" 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)

추천

출처http://43.154.161.224:23101/article/api/json?id=119385&siteId=1