JAVAのメモリリークに関する基礎知識
1. JAVAのメモリ割り当て戦略
2. JAVA はどのようにメモリを管理するのか
3. JAVA でのメモリ リーク
まず、JAVA のメモリ割り当て戦略を見てみましょう。
JAVAのメモリ割り当ては3つの部分に分かれています
1. 静的ストレージ領域
主に静的データ、グローバル数量などを保存します。これはプログラムのコンパイル時に割り当てられ、プログラムの動作全体を通じて常に存在します。
2. スタック格納領域
メソッド本体で作成される基本型変数は、スタック上にメモリ領域を作成します。オブジェクトを作成します。
3. ヒープストレージ
ヒープ領域は、動的メモリ割り当てとも呼ばれます。通常、それは新しいオブジェクトからの記憶です。メモリが使用されていない場合は、ガベージ コレクション期間までにメモリが回収されます。
スタック領域とヒープ領域の違いは次のとおりです。
スタック領域:メソッド本体内に作成される変数の基本型です。およびオブジェクト参照変数。メソッド本体にオブジェクトを作成すると、java は変数のメモリ領域をスタック領域に確保しますが、オブジェクトのスコープを超えるとオブジェクトは無効になります。このオブジェクトが占めるメモリ空間は、他のメソッドでも使用されます。最大の違いは、ヒープ内の変数スペースが Java のガベージ コレクション期間によって管理されることです。生成されたオブジェクト配列などはスタック領域に特殊な変数を定義することもできます。そして、この変数はオブジェクトが保存されているメモリアドレスです。
JAVAはメモリをどのように管理しますか
それは割り当てと解放の問題です
JAVAのメモリリーク
メモリ リークとは、不要なオブジェクト (使用されなくなったオブジェクト) がメモリを占有し続けること、または不要なオブジェクトのメモリが時間内に解放されないことを意味します。その結果、メモリ空間の無駄がメモリリークとなります。
メモリ リークが蓄積すると、OOM が発生する可能性があります。記憶に重大な影響を及ぼす。
1. 単純な関心 (アプリケーション以外のコンテキストを保持する単純な関心など)
2. 匿名の内部クラス
JAVA では、非静的内部クラスはデフォルトで外部クラスへの参照を保持します。
3.ハンドラー
ハンドラーを静的に変更するには。次に、弱い参照を使用して外部コンテキストを保持します。
または、rmovecallbackmessage を破棄します。
4. 静的変数の使用を避ける
大量のメモリを占有するバックグラウンド プロセスが最初にリサイクルされます。
5. リソースビットクローズによるメモリリーク
ブロードキャスト レシーバー、コンテンツ リザーバー、ドキュメント、カーソル、ストラム、ソケット、ビットマップなど。
6. asyntask によるメモリリーク
destroyでasyntask.cancelを実行できます