java對象布局JOL(java object layout),描述對象在堆內存的布局。如下圖:
1.markword 固定長度8byte,描述對象的identityhashcode,分代年齡,鎖信息等(https://www.cnblogs.com/katsu2017/p/12610002.html);
2.klasspoint 固定長度4byte, 指定該對象的class類對象(默認使用-XX:+UseCompressedClassPointers 參數進行壓縮,可使用-XX:-UseCompressedClassPointers關閉,則該字段在64位jvm下占用8個字節;可使用java -XX:+PrintCommandLineFlags -version 命令查看默認的或已設置的jvm參數);
3.基本變量:用於存放java八種基本類型成員變量,以4byte步長進行補齊,使用內存重排序優化空間;
4.引用變量:存放對象地址,如String,Object;占用4個字節,64位jvm上默認使用-XX:+UseCompressedOops進行壓縮,可使用-XX:-UseCompressedOops進行關閉,則在64位jvm上會占用8個字節;
5.補齊:對象大小必須是8byte的整數倍,用來補齊字節數。Object o = new Object() 在內存中占用16個字節,其中最后4個是補齊;
6.數組長度:如果是數組,額外占用固定4byte存放數組長度;
示例展示
1.jvm基本信息
4, 1, 1, 2, 2, 4, 4, 8, 8 分別表示:引用句柄, byte, boolean, char, short, int, float, double, long長度
2.new object
對象大小是16字節,其中最后4個字節是用來對齊的。
3.對象內存重排序
1)如果8種基本變量定義為包裝類型,則變成了引用變量
2)以8byte為步長分配空間,header占用固定12字節,故開始需要對齊的4字節從int和float中選(哪個定義在前選哪個)
3)其他成員變量的分配順序是基本類型變量優先引用類型變量,基本類型優先級double>long>float>char>short>byte>boolean,將補齊字節數降到最低
4.對象繼承
其中父類中的成員變量優先於子類,其他同上
參考:
1.https://segmentfault.com/a/1190000012354736
2.https://blog.csdn.net/liuxiao723846/article/details/91981757