アンドリュース8つの可能なメモリリーク

     Javaのガベージコレクタは、開発者は、特にによる崩壊につながった部分的な障害への適用を減らす、メモリ割り当てを管理する必要がありますが、転落したメモリ・スタックのリリースなので、書き込みより安全なコードを防ぐものではありません。

         しかし、Javaのロジックの多くは容易に可能で、メモリリークにつながる残っています。あなたが注意していない場合、光スローOOMの偽メモリのどの結果、未発表のメモリを無駄にするのは簡単です

         メモリリーク

  1. 一般的なメモリリーク(伝統的なメモリリーク):(カーソルなどの近くに忘れる)原因のリリースによって割り当てられたメモリを忘れてしまいました
  2. 論理メモリリーク(論理的なメモリリーク):アプリケーションは、もはやこのオブジェクトを必要としませんが、オブジェクトは、まだすべての参照をリリースしていない場合には

 

あなたは、オブジェクトへの強い参照を保持した場合、ガベージコレクタは、メモリ内のオブジェクトを再利用することはできません

       Androidのは、最も簡単な文脈の活動として、メモリリークコンテキストにつながり、そのようなビューの階層や他のリソースなどのメモリ参照、が多く含まれています。リークコンテキストと、それはすべてのオブジェクトは、それがリークを指すことを意味します。限られたメモリとアンドロイドのマシン、簡単にOOMにつながるあまりにも多くのメモリリーク

       Activity.onDestroy()活動は人生の終わりとみなされ、それはプログラムは、それが破壊されなければならないようだ、またはこれらのAndroidのシステムメモリを回復する必要性(活動メモリが十分ではありません、アンドロイド見えない回復します)

       Activity.onDestroy()が実行された場合は、残っている活動を保持するスタックを参照し、ガベージコレクタは、(結果の活動がそのライフサイクルの外で生き残る)を回収し、メモリとしての彼のマークを付けることはできません

       3つ以上の潜在的なメモリリークトラップにつながります:

  1. 静的変数のグローバル・プロセス(プロセス・グローバル)。この無視アプリケーションの状態は、物事の活動への強い参照を保持しています
  2. ライブスレッドアクティビティのライフサイクルに加えて。活動への強い参照を空にしません。

-------------------------------------------------- -------------------------------------------------- ------------

静的な活動

       クラスで定義されたアクティビティの静的変数、現在静的変数に割り当てられたインスタンスを実行しているアクティビティ。

        これは人生の終わりに静的変数の活動を消去しない場合は、メモリリークにつながります。静的なアプリケーションのライフサイクル全体を通して、漏れた活動は、常にアプリケーション・プロセスに存在していますので、ガベージコレクトされないので。 

 

       静的アクティビティ活動を避けるためにそのようなコード。

-------------------------------------------------- -------------------------------------------------- ------------

静的活動セーブで単一の実施形態のビュー

        アクティビティがしばしば使用される場合、単一の実施形態では、次にメモリに記憶された非常に実用的な例です。しかし、アプリケーションのライフサイクルの単一例のライフサイクルのために、このアクティビティのライフサイクルを延長します(ライフサイクルを延長するために強制的に活動ができない類似したオブジェクトの活動の一つの場合保存どのような場合には、非常に危険かつ不要です)

         特殊なケース:ビューは多くのリソースを初期化する場合は、だけでなく、ライフサイクル活動の活動が破壊されたときに、それがあるべき、このように、ツリービュー(ビューHierachy)にロードされ、その後、あなたは静的にそれを回すことができ、同じままリソースを解放します。(破壊時にビューのこの静的なビューがヌルに設定されて表示すべきです)

 

        着信中の活性インスタンスが解放されていない場合にシングルトンのgetInstance()メソッドは、その後、活性は常に存在する場合。したがって、メモリリークを引き起こします。

         ときに着信コンテキスト)(context.getApplicationContextを渡すことができます

          静的ビューが推奨されていない場合、またはヌルのセットに破壊されなければなりません

        内部クラス:強い増加の読みやすさが、メモリリークの原因は、こうした活動オブジェクトが保持する内部クラスなどの外部クラスのインスタンスへの参照、内部に保持されます

        ソリューション1.静的な匿名内部クラスになるために、静的な内部クラス、匿名内部クラスへの内部クラス

                          2.性の強い対照活性、弱参照に対するプロパティの参照がある場合

                          onDestroy活動、これらの時間のかかるタスクの終了を実行する業務の場合は3、

-------------------------------------------------- -------------------------------------------------- ------------

内部クラス

        これは読みやすさとカプセル化を向上させることができ、内部のActivityクラスがあるとします。我々は内部クラスを作成するだけでなく、静的変数への参照を保持している場合、それはメモリリークが(とき空白に破壊することができます)可能性が高いです

        利点の1つは内部クラスは、外部クラスにアクセスできることで、メモリリークの理由で、その結果、良好ではない内部クラスは、クラスのインスタンスへの外部参照を保持するからです。

-------------------------------------------------- -------------------------------------------------- ------------

匿名クラス

        匿名クラスは、外側のクラスへの参照を維持します。だから、メモリリークを使用すると、AsyncTaskで匿名の活動を定義するときに発生する可能性があります。AsyncTaskアクティビティインスタンスを開催しました残念ながら破壊された背景、活動中曇り充填時間のかかるタスク(ユーザー出口、システム回復)時のタスクの実行には、ゴミは非同期タスクの終了まで収集されませんとき。

-------------------------------------------------- -------------------------------------------------- ------------

ハンドラ

         同様に、匿名のRunnableの定義は、匿名のハンドラを実行します。実行可能なクラスは外部クラスの暗黙的な参照の内側に保持され、それはメッセージキューハンドラーキューメッセージに送信され、メッセージは、メッセージまで処理されていない、アクティビティインスタンスは、このようにメモリリークにつながる、破壊されないであろう。

-------------------------------------------------- -------------------------------------------------- ------------

スレッド

        長いクラスの匿名のインスタンスと同様に、作業者か否か、メモリリークにつながる、対照活性を保持します

-------------------------------------------------- -------------------------------------------------- ------------

TimerTaskを

        長いクラスの匿名のインスタンスと同様に、作業者か否か、メモリリークにつながる、対照活性を保持します

-------------------------------------------------- -------------------------------------------------- ------------

センサーマネージャー

         Context.getSystemService(int型名)によって、システム・サービスを取得することができます。これらのサービスは、ハードウェアの相互作用を処理する、それぞれのプロセス、ヘルプアプリケーションの処理バックグラウンドタスクで動作します。破壊されていない場合は、これらのサービスを使用する必要がある場合は、参照のコンテキストが保持しているサービスにつながることができ、リスナーを登録することができ、モニターオフアクティビティログは、メモリリークが発生する場合

 

 

http://tryenough.com/android-momeryleakメモリリークとソリューション

 

おすすめ

転載: www.cnblogs.com/acg88688/p/11870576.html