使用JOL工具分析java對象大小


JOL全稱為Java Object Layout,是分析JVM中對象布局的工具

java對象的組成部分:

  • 1.對象頭
    在jvm虛擬機中每一個java對象都有一個對象頭,對象頭中包含標記字段以及對象指針,標記字段用來儲存hash碼、gc信息以及鎖信息,而指針則指向改對象的類。在64位jvm虛擬機中這兩部分都是64位的,所以也就是需要128位大小(16 bytes)。
    注意:64位虛擬機中在堆內存小於32GB的情況下,UseCompressedOops是默認開啟的,該參數表示開啟指針壓縮,會將原來64位的指針壓縮為32位。
  • 2.實例數據
    類中所有的實例字段數據。
  • 3.內存填充部分(alignment)
    該部分作用是用來保證java對象在虛擬機中占內存大小為8N bytes。
  • 4.數組長度
    這個是數組對象才特有的。

java的基礎數據類型所占內存情況如下表格:

boolean byte short char int long float double
1 bytes 1 bytes 2 bytes 2 bytes 4 bytes 8 bytes 4 bytes 8 bytes

 

要使用JOL工具,先引入依賴:

        <!--Java Object Layout -->
        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.11</version>
        </dependency>

測試代碼如下:

public class TestJOL {
  public static void main(String[] args) {
    Object o = new Object();

    System.out.println(ClassLayout.parseInstance(o).toPrintable());
  }
}

運行結果:

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

從運行結果可以看到一個Object對象實例在內存中占16字節。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM