android - java中使用MAT是shallow size 單位是什么
問題描述
java中shallow size 單位是什么
問題解答
回答1:想要說清楚shallow size就必須要提到Retained Size。shallow size: 表示自身對象占用的大小。retained size: 自身對象+引用對象的retained大小。
先借用一張圖,這張圖更能清楚的表示他們之間的計算關系。
B的shallow size = B;
B的retained size = B shallow size + C retained size + D retained size;
在舉例之前,首先要了解JAVA對象在堆中的存儲,我們以32位JVM虛擬機為例:JAVA對象在堆中共有3個部分組成:
對象頭 對象頭又包含兩部分數據; 一:運行時數據。 32位JVM為32位即4byte.64位為8byte. 二:類型指針。
實例數據 即存放實例變量的數據,變量類型包括兩種 基本類型變量和引用變量。 基本類型變量所占據的字節大小就不說了,引用變量我們存放的是指針。
填充數據 對象存儲空間為8byte的整數倍,如果對象頭+實例數據不足8byte的整數倍,則進行填充。
說到引用類型大小,32位虛擬機下引用占據4byte. 64位虛擬機下如果不開啟指針壓縮,則引用占據8byte。
下面我們根據例子進行說明:
public class TestObjSize { private int a = 1; private boolean b = true; private TestObjSize testObjSize;public static void main(String[] args) {Object object = new Object();TestObjSize test = new TestObjSize();//這個new出來的對象記為obj1test.testObjSize = new TestObjSize();//這個new出來的對象記為obj2System.out.println(object.hashCode());System.out.println(test.hashCode());try { Thread.sleep(3000000);} catch (InterruptedException e) { e.printStackTrace();} }}
因為shallow size與實例變量是否有引用無關,所我們先分析下**TestObjSize的shallow size,shallow size = 4byte(對象頭) + 4byte(類型指針) + 4byte(int a) + 1byte(boolean b) + 4byte(TestObjSize引用) = 17;** 17不是8的整數倍所以會有7個byte的填充數據,最終TestObjSize類型的實例對象的shallow size = 24;
根據例子我們看到obj2對象的testObjSize = null,obj2的retained size = obj2的shallow size = 24;obj1對象的testObjSize為obj2,所以obj1的retained size = obj1的shallow size + obj2的retained size = 48;
最后附上heapdump!
如有錯誤,請看客指證。
相關文章:
1. mac OSX10.12.4 (16E195)下Mysql 5.7.18找不到配置文件my.cnf2. mysql - 數據庫表中,兩個表互為外鍵參考如何解決3. 在mybatis使用mysql的ON DUPLICATE KEY UPDATE語法實現存在即更新應該使用哪個標簽?4. mysql - 數據庫建字段,默認值空和empty string有什么區別 1105. mysql儲存json錯誤6. sql語句 - 如何在mysql中批量添加用戶?7. mysql - 表名稱前綴到底有啥用?8. php - 公眾號文章底部的小程序二維碼如何統計?9. Navicat for mysql 中以json格式儲存的數據存在大量反斜杠,如何去除?10. mysql - 怎么生成這個sql表?
