メモリリークの特定に常に苦労しています。私は私のプロジェクトでいくつかのメモリリークを持っていると思います。circular progress view実際の例のメモリリーク
私の推測の1つは、内部クラスFadeRunnable
にメモリリークがあることです。 しかし正直言って、これが正確に問題の原因であるかどうかを知る方法を正確には分かりません。さて、通常のシナリオを実行して向きを切り替えると、以下に示すようにメモリ使用量が増加します。私はFadeRunnable
クラスの使用法をコメントアウトした場合、私は何かを参照して、ステップが小さくなっている(が、まだそこに、私はそれが唯一のリークはないと思う)私は、ヒープ・ダンプを分析すると
。しかし、実際には値の意味が分かりません。私は物事は
- 変更オリエンテーション何倍である。私は推測しますこれは「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)からの起動をお勧めします。それはあなたが文脈を漏らした場合あなたに表示されるボックスの外に統合することは非常に簡単です。 –
ええ、私の大きなプロジェクトには既にそれを使用してください。しかし、実際には、第三者のlibに頼るのではなく、すべてを理解することに興味があります! –