簡體   English   中英

Android:淺堆和保留堆之間的區別是什么

[英]Android: what is the differences between shallow and retained heap

我試圖通過MAT找出應用程序的內存泄漏,這里在list_object我發現了一些數值int Shallow heapretained heap列。 這些價值是什么,以及如何知道內存泄漏的位置。

來自Nikita Salnikov-Tarnovski的博客

淺堆很容易 - 它只包含對象本身占用的堆。 如何計算它有一些細微差別,但對於本文的范圍,我們保持原樣。 請繼續關注同一主題的未來帖子。

保留堆在許多方面更有趣。 您很少對淺堆感興趣,在大多數情況下,您的實際問題可以轉換為“如果我從內存中刪除此對象,現在可以通過垃圾收集器釋放多少內存”。

現在,我們都記得,所有Java垃圾收集(GC)算法都遵循以下邏輯:

1)有些物體被GC認為是“重要的”。 這些被稱為GC根,並且(幾乎)從不丟棄。 例如,它們當前正在執行方法的局部變量和輸入參數,應用程序線程,來自本機代碼的引用以及類似的“全局”對象。

2)假定從這些GC根引用的任何對象都在使用中,因此GC不會丟棄它們。 一個對象可以在Java中以不同方式引用另一個對象,在最常見的情況下,對象A存儲在對象B的字段中。在這種情況下,我們說“B引用A”。

3)重復該過程,直到訪問可從GC根傳遞到的所有對象並標記為“使用中”。

4)其他一切都未使用,可以扔掉。

來自eclipse內存分析器的文檔

淺與保留堆

淺堆是一個對象消耗的內存。 一個對象每個引用需要32位或64位(取決於OS體系結構),每個整數4個字節,每個長度8個字節等。根據堆轉儲格式,可以調整大小(例如,對齊到8等等... )更好地模擬VM的實際消耗。

保留的X集是當X被垃圾收集時將由GC移除的對象集。

保留的X 是保留的X集中所有對象的淺大小的總和,即由X保持活着的內存。

一般來說,對象的淺堆是它在堆中的大小,同一對象的保留大小是當對象被垃圾收集時將釋放的堆內存量。

一組主要對象的保留集,例如特定類的所有對象或由特定類加載器加載的所有類的所有對象,或者僅僅是一堆任意對象,是如果所有對象都被釋放的對象集。領先的集合變得無法訪問。 保留集包括這些對象以及只能通過這些對象訪問的所有其他對象。 保留的大小是保留集中包含的所有對象的總堆大小。 在此輸入圖像描述

最小保留大小給出保留大小的良好(欠)估計,其計算方式比一組對象的精確保留大小快。 它僅取決於被檢查集中的對象數,而不是堆轉儲中的對象數。

簡單來說,對象的淺堆是它在堆中的大小,同一對象的保留大小是當對象被垃圾回收時將釋放的堆內存量。 更多細節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM