轉載請註明地址:http://blog.csdn.net/yincheng886337/article/details/50517375
Shallow Size:
對象本身佔用的內存空間,不包含其引用的對象,但在JAVA中除基本類型外,一切均爲對象,也就是說持有的一直爲對象的引用,如String類型對象,它主要包含3個int成員(3*4B)、1個char[]成員(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可以直接或間接訪問的對象爲藍色節點,而左圖中obj3是GC Roots可達的,也就是說斷掉obj1到obj3的Reference chain後,obj3還有GC Roots的Reference chain,因而在gc時obj1被回收也不會回收obj3,因此在左圖obj1的obj1的Retained Size = obj1 + obj2 + obj4 的shallow size,而右圖obj1的Retained 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進一步查看。
參考: