java对象在内存中的布局
目錄
- 如何查看對象的大小
- 分析java對象的組成
- 普通對象
- 數組對象
如何查看對象的大小
這里介紹一種工具JOL:Java Object Layout( java對象布局)
這個工具可以查看對象大小
首先在pom.xml里引入(版本時實際情況設置):
Java類
import org.openjdk.jol.info.ClassLayout;public class HelloWorld {public static void main(String[] args) {Object o1 = new Object();String s1 = ClassLayout.parseInstance(o1).toPrintable();System.out.println("普通對象:\n"+s1);Object o2 = new int[2];String s2 = ClassLayout.parseInstance(o2).toPrintable();System.out.println("數組對象:\n"+s2);} }結果:
分析java對象的組成
觀察虛擬機配置命令 java -XX:+PrintCommandLineFlags -version
普通對象
普通對象的內存結構由 markword、ClassPointer、實例數據、對齊 組成。
markword: 占8個字節 (記錄了鎖的標識位:標識對象的狀態,GC標記:對象被回收了多少次 分代年齡)。
ClassPointer:對應的壓縮設置:-XX:+UseCompressedClassPointers 開啟時為4字節(默認開啟) ,不開啟為8字節 (屬于指向哪個類型)。
實例數據:對應的壓縮設置:-XX:+UseCompressedOops 開啟時每個數據占4字節(默認開啟), 不開啟占8字節。 Oops: Ordinary Object Pointers
例如:
在壓縮的情況下A的內存結構
在不壓縮的情況下A的內存結構
對齊:8的倍數 (64位的機器按塊來讀,一下子讀8個字節)。
數組對象
數組對象的內存結構由 markword、ClassPointer、數組長度、數組數據、對齊 組成。
markword:同上
ClassPointer:同上
數組長度:占4個字節(記錄了數組的長度)
數組數據:占(4*數組長度)個字節。
對齊:同上。
1.其中普通對象的對象頭由 markword 和 ClassPoiner 構成;數組對象的對象頭由 markword 、 ClassPoiner、數組長度構成
2.關閉在壓縮要在 VM options 中設置 -XX:-UseCompressedClassPointers,
-XX:+UseCompressedOops,也就是開啟時Use前面是+,關閉時是-
3.此外,有的舊文章中說markword是4個字節的,那是因為那時候電腦是32位,而現在的電腦應該差不多都是64位了
總結
以上是生活随笔為你收集整理的java对象在内存中的布局的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杭州武警士官学校是本科还是专科
- 下一篇: redis的基本使用笔记一