android - java中使用MAT是shallow size 單位是什么
問(wèn)題描述
java中shallow size 單位是什么
問(wèn)題解答
回答1:想要說(shuō)清楚shallow size就必須要提到Retained Size。shallow size: 表示自身對(duì)象占用的大小。retained size: 自身對(duì)象+引用對(duì)象的retained大小。
先借用一張圖,這張圖更能清楚的表示他們之間的計(jì)算關(guān)系。
B的shallow size = B;
B的retained size = B shallow size + C retained size + D retained size;
在舉例之前,首先要了解JAVA對(duì)象在堆中的存儲(chǔ),我們以32位JVM虛擬機(jī)為例:JAVA對(duì)象在堆中共有3個(gè)部分組成:
對(duì)象頭 對(duì)象頭又包含兩部分?jǐn)?shù)據(jù); 一:運(yùn)行時(shí)數(shù)據(jù)。 32位JVM為32位即4byte.64位為8byte. 二:類(lèi)型指針。
實(shí)例數(shù)據(jù) 即存放實(shí)例變量的數(shù)據(jù),變量類(lèi)型包括兩種 基本類(lèi)型變量和引用變量。 基本類(lèi)型變量所占據(jù)的字節(jié)大小就不說(shuō)了,引用變量我們存放的是指針。
填充數(shù)據(jù) 對(duì)象存儲(chǔ)空間為8byte的整數(shù)倍,如果對(duì)象頭+實(shí)例數(shù)據(jù)不足8byte的整數(shù)倍,則進(jìn)行填充。
說(shuō)到引用類(lèi)型大小,32位虛擬機(jī)下引用占據(jù)4byte. 64位虛擬機(jī)下如果不開(kāi)啟指針壓縮,則引用占據(jù)8byte。
下面我們根據(jù)例子進(jìn)行說(shuō)明:
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();//這個(gè)new出來(lái)的對(duì)象記為obj1test.testObjSize = new TestObjSize();//這個(gè)new出來(lái)的對(duì)象記為obj2System.out.println(object.hashCode());System.out.println(test.hashCode());try { Thread.sleep(3000000);} catch (InterruptedException e) { e.printStackTrace();} }}
因?yàn)閟hallow size與實(shí)例變量是否有引用無(wú)關(guān),所我們先分析下**TestObjSize的shallow size,shallow size = 4byte(對(duì)象頭) + 4byte(類(lèi)型指針) + 4byte(int a) + 1byte(boolean b) + 4byte(TestObjSize引用) = 17;** 17不是8的整數(shù)倍所以會(huì)有7個(gè)byte的填充數(shù)據(jù),最終TestObjSize類(lèi)型的實(shí)例對(duì)象的shallow size = 24;
根據(jù)例子我們看到obj2對(duì)象的testObjSize = null,obj2的retained size = obj2的shallow size = 24;obj1對(duì)象的testObjSize為obj2,所以obj1的retained size = obj1的shallow size + obj2的retained size = 48;
最后附上heapdump!
如有錯(cuò)誤,請(qǐng)看客指證。
相關(guān)文章:
1. css3 - sublime text2 的less2css插件怎么使用2. javascript - 微信公眾號(hào)網(wǎng)頁(yè)使用redux如何管理用戶(hù)刷新?3. css3 - 求clearfix使用方法4. html5 - z-index在瀏覽器調(diào)試有效 手機(jī)測(cè)試無(wú)效5. javascript - 微信小程序 如何實(shí)現(xiàn)這種左滑動(dòng)出現(xiàn)刪除的辦法?有相關(guān)api嗎?6. css - 不用position:absolute怎么實(shí)現(xiàn)類(lèi)似的功能7. angular.js使用$resource服務(wù)把數(shù)據(jù)存入mongodb的問(wèn)題。8. 關(guān)于docker下的nginx壓力測(cè)試9. docker-machine添加一個(gè)已有的docker主機(jī)問(wèn)題10. angular.js - angularjs的自定義過(guò)濾器如何給文字加顏色?
