我一直在努力識別內存泄漏。我想我的項目circular progress view有幾個內存泄漏。實際示例中的內存泄漏
我的猜測之一是我在內部類FadeRunnable
內存泄漏。 但說實話,我不知道如何確定這是否是問題的根源。那麼,當我執行通常的方案並切換方向時,就會看到內存使用量增加,如下所示。如果我註釋掉FadeRunnable
類的使用步驟是小(但還是存在的,所以我想這是不是唯一的泄漏)
有一次,我分析了堆轉儲,我看到的東西。但實際上我不知道這些價值是什麼意思。我做的事情是
- 改變方向多次
- 打開堆轉儲和分類方式「保留大小」
- 現在,當我點擊「CircularProgressView」我看到在右側區域8行。我猜這意味着還有的「CircularProgressView」泄露和生活在記憶裏孤兒的地方。
這是正確的嗎?如果是這樣,我怎麼能在轉儲信息找出(我想在某處8個實例下方的窗格)保存/保存此對象的位置。
我很想有一個一步一步的解釋如何找出是否和對象泄漏一些內存。
可疑視圖的所有代碼都可以在這個類中找到。
但也隨時檢查出完整的項目更深入的瞭解,如果你想要玩它。
在此先感謝!
UPDATE從上面的代碼鏈接顯示MEM-泄漏內部類的固定代碼。下面的代碼片段顯示了原本應該永遠不會使用的代碼泄漏代碼
/**
* Mem-leaking code, for fixed code see repository link
* https://github.com/momentummodules/CircularProgressView/blob/master/circularprogressview/src/main/java/momentum/circularprogressview/CircularProgressView.java
*/
public class CircularProgressView extends View
{
...
private Thread fadeThread = null;
...
...
class FadeRunnable implements Runnable
{
@Override
public void run()
{
...
}
}
...
...
private void startFade(boolean fadeIn)
{
// check existing
if(this.fadeThread != null)
{
// check if fade is already running
switch(this.fadeThread.getState())
{
case TERMINATED:
case NEW:
this.fadeThread = null;
break;
case RUNNABLE:
case BLOCKED:
case TIMED_WAITING:
case WAITING:
return;
}
}
// create new
this.fadeThread = new Thread(new FadeRunnable(fadeIn, this.fadeTime));
this.fadeThread.start();
}
}
我會建議從LeakCanary庫開始:https://github.com/square/leakcanary。集成和開箱非常容易,它會告訴你,如果你泄漏的背景。 –
是的,使用它已經爲我的大項目。但實際上,我有興趣瞭解整個事情,而不是依賴第三方庫! –