、静的変数はヒープに住んで、そして時にそのクラスのロードに割り当てられています。インスタンス変数のガベージコレクションの適格性はインスタンスに結びついています。
value-type(int、bool、doubleなど)を使用します。)静的変数はクラスのインスタンスをリークしません。値型以外の静的変数を許可すると、これらの静的変数で参照されるものはすべてリークできます。
あなたは静的変数に(参照型がコンテキストであっても)活動オブジェクトへの参照を保持している場合、あなたはActivityオブジェクトをリークします
public class Activity extends Context {
static int willNotLeakActivity = 0;
static Context mayLeakActivity = new Context();
//if you call activityA.leakyMethod(activityA); you will leak activityA
public void leakyMethod(Context context){
mayLeakActivity = context;
}
//this method won't leak the instance
public void safeMethod(int arg){
willNotLeakActivity = arg;
}
}
単純なクラスを考えてみましょう。
Androidは実際のJVM上ではなくDalvik VM上で実行されるため、結果は理論的には異なる可能性がありますが、DalvikはGCの適格性が異なる限り、非常に驚きます(私は自分自身の問題に遭遇していない)。 GCルートからの参照チェーンに従うことで到達できる限り、オブジェクトはガベージコレクションに適格になりません。アクティビティオブジェクトはインスタンス化され、Androidプロセス(通常は少なくともstatic void main(string[] args)
に類似したものとして生きていると仮定します)
システムがyourActivityInstance.onDestroy()を呼び出して冗長性を解放すると、そのオブジェクトはあなたの活動のインスタンスがGCルートから別の参照を介して到達可能な場合を除き、この参照が保持されるべきであるより長く保持されていれば(これは無期限に読み込まれています) GCは漏れたオブジェクトのリソースを安全に解放できるとは確信できません。
この参照がどのように保持されているかは関係ありません(静的または非静的、最終または非最終)。オブジェクトはGC rから到達することができますoot(少なくとも静的メソッドのローカル変数とスコープ内変数、ロードされたクラスの静的フィールド)、あなたはリークするでしょう。
この質問を改善するために、より多くの情報を提供する必要があります。あなたのアプリがメモリを漏らしている問題にぶち当たっているのですか?アンドロイドプラットフォームで静的な最終定数を使用することによる漏れの影響についてのみ聞いたことがありますか? –
私は現時点でリークを取得していません(私は意図的にメモリリークの例に続いてリークを起こしました)。私はメモリリークを引き起こさないように理解しようとしています。この質問に対する回答のいくつかは良い情報を与えており、私は時間をかけて過ごすでしょう。最初の明確化は、定数のstatic finalはOK(推奨)ですが、アクティビティへの参照を持つコンテキスト・タイプ(アクティビティ)やビューとドロワブルにはstatic finalを使用しないことです。 – DerekD