2012-04-04 11 views
4

メモリリークの原因となる静的な最終定数の使用に関する質問は、Androidアプリでメモリリークを引き起こさない方法に関する情報を検索しています。 1つの大きな問題は、定数にプライベートstatic finalを使用することです。明らかに定数がどのように定義されるべきかです。しかし、静的な最終的な意味は、回転の後にハングアップし、アクティビティをクリアできないことを意味します。スタティックファイナルのAndroidメモリリーク

明らかに私は何かを誤解しています。私は、アプリケーションのコンテキストに変数を置くことで、問題を起こさずにハングアップできることを知っています。

メモリリークに関する一般的な質問:メモリリークに関する多くの情報がありますが、すべての情報を明確にまとめるものは見つかりません。すべての推奨事項は完全に説明されています。

+0

この質問を改善するために、より多くの情報を提供する必要があります。あなたのアプリがメモリを漏らしている問題にぶち当たっているのですか?アンドロイドプラットフォームで静的な最終定数を使用することによる漏れの影響についてのみ聞いたことがありますか? –

+0

私は現時点でリークを取得していません(私は意図的にメモリリークの例に続いてリークを起こしました)。私はメモリリークを引き起こさないように理解しようとしています。この質問に対する回答のいくつかは良い情報を与えており、私は時間をかけて過ごすでしょう。最初の明確化は、定数のstatic finalはOK(推奨)ですが、アクティビティへの参照を持つコンテキスト・タイプ(アクティビティ)やビューとドロワブルにはstatic finalを使用しないことです。 – DerekD

答えて

11

この情報は間違っています。変数static finalを作成しても、static finalとマークされただけなので、メモリリークは発生しません。それはあなたがそれを行うことによってメモリリークを作成することはできないと言っているわけではありません。あなたが避けたいことの1つは、タイプのコンテキスト(アクティビティーなど)の静的変数を作成することです。コンテキストへの静的な参照を作成すると、メモリリークが発生する可能性があります。静的変数とは、アプリケーション全体およびそのクラスのインスタンスにわたってその変数のコピーが1つだけ存在することを意味します。また、明示的にクリアされるかアプリケーションがシャットダウンされるまで、メモリに残ることを意味します。静的変数はクラスレベルの変数であり、オブジェクトの特定のインスタンスには関連付けられていません。たとえば、 'public static final string myString = "Hello"を作成すると、決してメモリリークが発生しません。このように定数を定義する方法は、静的なメモリ位置がなくても、このクラスのすべてのインスタンスに対してその文字列を格納するために、すべてのインスタンスに対して1つのコピーを保持するのではなく、 'public final string myString = "Hello"使用する。

0

アクティビティ自体を参照していない場合、定数によってメモリリークが発生することはありません。アクティビティで定数(例:String)を使用することに問題はありません。

メモリリークについては、そのトピックをキャプチャ2つの良いのリソースがあります。

  • 説明メモリ管理に関するGoogleのIOプレゼンテーション
  • here Androidデベロッパーブログからhere
0

静的定数は必ずしもありません周りの活動を保持し、非常に標準的です。この問題は、そのアクティビティの意図された期間を超えて生きているあなたのアクティビティ(ビューや描画可能なものなど)への参照を保持するスタティックがあるときに発生します。

メモリ解析のための適切な開始点here,here、およびhere。また、一般的にガベージコレクションの仕組みを調べるだけで十分です。

1

これはAndroidのすべてのメモリ管理に対応し、メモリリークの検出について詳しく説明するかなり良いビデオです。あなたの求めるものではありませんが、同じスレッドで言及する価値はありません。 Javaで

http://www.youtube.com/watch?v=_CruQY55HOk

4

、静的変数はヒープに住んで、そして時にそのクラスのロードに割り当てられています。インスタンス変数のガベージコレクションの適格性はインスタンスに結びついています。

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(少なくとも静的メソッドのローカル変数とスコープ内変数、ロードされたクラスの静的フィールド)、あなたはリークするでしょう。

関連する問題