Shallow Size、Retained Size、Heap Size和Allocated

轉載請註明地址:http://blog.csdn.net/yincheng886337/article/details/50517375

Shallow Size

對象本身佔用的內存空間,不包含其引用的對象,但在JAVA中除基本類型外,一切均爲對象,也就是說持有的一直爲對象的引用,如String類型對象,它主要包含3int成員(3*4B)1char[]成員(1*4B)以及一個對象頭(8B),儘管char[]可能指向一大塊字符,但String對象裏只有一個引用所佔4B的空間,因此String類型對象的Shallow Size就是12B+4B+8B = 24B

 

Retained Size:

對象本身的Shallow Size + 對象能直接或間接訪問到的對象的Shallow Size,也就是說Retained Size就是該對象被gc之後所能回收內存的總和。

 

爲了更好地理解Retained Size,不妨以圖1加以說明,圖中每個節點對應內存中的一個對象,但注意這裏有個特殊的節點GC Roots(詳見註解),它也是Reference chain的起點。在圖3中,從對象obj1入手,可知通過obj1可以直接或間接訪問的對象爲藍色節點,而左圖中obj3GC Roots可達的,也就是說斷掉obj1obj3Reference chain後,obj3還有GC RootsReference chain,因而在gcobj1被回收也不會回收obj3,因此在左圖obj1obj1Retained Size = obj1 + obj2 + obj4 shallow size,而右圖obj1Retained Size = obj1 + obj2 + obj4 +obj3 shallow size.總之,Retained size是一個整體度量,能反映內存結構和對象圖的依賴關係,還可以找到根節點。


 

圖1 Retained Size示例圖

注:GC Roots特指垃圾收集器對象,JVM GC時會回收那些不是GC roots且沒有被GC roots引用的對象。JVM對內存中對象進行回收,主要是通過GC Roots Tracing來辨別對象是否在使用,進而進行回收。也就是說通過一系列名爲“GC Roots”的對象作爲起始點,從節點向下搜索,搜索過的路徑稱之爲Reference Chain,當一個對象到GC Roots沒有任何Reference Chain相連時,則表明此對象不可用,GC時將被回收(該流程的示例圖見圖2)。

 

圖2.GC Roots Tracing回收機制

 

  Heap Size: 

堆的大小,當資源增加,當前堆的空間不夠時,系統會增加堆的大小,若超過上限(如64M,閾值視平臺而定)則會被殺掉

 Allocated:

堆中已分配的大小,即App應用實際佔用的內存大小,資源回收後,此項數據會變小。

建議:若單一操作反覆進行,堆大小一直增加,則有內存泄露的隱患,可採用MAT進一步查看。

參考:

http://blog.csdn.net/time_hunter/article/details/12405127

http://blog.csdn.net/kingzone_2008/article/details/9083327

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章