① 怎麼確定java對象的大小
普通對象的結構如下,按64位機器的長度計算
1. 對象頭(_mark), 8個位元組
2. Oop指針,如果是32G內存以下的,默認開啟對象指針壓縮,4個位元組
3. 數據區
4.Padding(內存對齊),按照8的倍數對齊
數組對象結構是
1. 對象頭(_mark), 8個位元組
2. Oop指針,如果是32G內存以下的,默認開啟對象指針壓縮,4個位元組
3. 數組長度,4個位元組
4. 數據區
5. Padding(內存對齊),按照8的倍數對齊
清楚了對象在內存的基本布局後,咱們說兩種計算Java對象大小的方法
1. 通過java.lang.instrument.Instrumentation的getObjectSize(obj)直接獲取對象的大小
2. 通過sun.misc.Unsafe對象的objectFieldOffset(field)等方法結合反射來計算對象的大小
java.lang.instrument.Instrumentation.getObjectSize()的方式
先講講java.lang.instrument.Instrumentation.getObjectSize()的方式,這種方法得到的是Shallow Size,即遇到引用時,只計算引用的長度,不計算所引用的對象的實際大小。如果要計算所引用對象的實際大小,可以通過遞歸的方式去計算。
java.lang.instrument.Instrumentation的實例必須通過指定javaagent的方式才能獲得,具體的步驟如下:
1. 定義一個類,提供一個premain方法: public static void premain(String agentArgs, Instrumentation instP)
2. 創建META-INF/MANIFEST.MF文件,內容是指定PreMain的類是哪個: Premain-Class: sizeof.ObjectShallowSize
3. 把這個類打成jar,然後用java -javaagent XXXX.jar XXX.main的方式執行
有興趣可以看下博主的:http://blog.csdn.net/iter_zc/article/details/41822719