[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
質問
を作成するように言われました。 メモリリーク Javaで
もちろん、どうやって作ればいいのか、まったくわからない状態だったのは言うまでもありません。
例えばどんなことでしょうか?
どのように解決するのですか?
純粋なJavaで真のメモリーリーク(実行中のコードからはアクセスできないが、メモリーには保存されているオブジェクト)を作り出す良い方法を紹介します。
- アプリケーションが長時間稼働するスレッドを作成する(あるいはスレッドプールを使ってさらに高速にリークする)。
-
スレッドは、(オプションでカスタムの)
ClassLoader
. -
クラスが大きなメモリチャンクを確保する(例えば
new byte[1000000]
)、それへの強い参照を静的フィールドに格納し、自分自身への参照をThreadLocal
. 余分なメモリの確保は任意ですが(クラスインスタンスのリークで十分です)、リークの動作がそれだけ速くなります。 -
アプリケーションはカスタムクラスへのすべての参照を消去するか、または
ClassLoader
からロードされた。 - 繰り返してください。
方法によるもの
ThreadLocal
が Oracle の JDK で実装されているため、メモリリークが発生します。
-
各
Thread
はプライベートフィールドthreadLocals
で、実際にスレッドローカルの値を格納する。 -
それぞれの
キー
への弱い参照である。
ThreadLocal
オブジェクトが作成されるので、その後にThreadLocal
オブジェクトがゴミとして回収されると、そのエントリはマップから削除されます。 -
しかし、各
値
は強い参照なので、ある値が (直接または間接的に)
ThreadLocal
オブジェクトを作成します。 キー そのスレッドが生きている限り、そのオブジェクトはガベージコレクトされることも、マップから削除されることもない。
この例では、強い参照の連鎖は次のようになります。
Thread
オブジェクト →
threadLocals
map → exampleクラスのインスタンス → exampleクラス → static
ThreadLocal
フィールド →
ThreadLocal
オブジェクトを作成します。
(その
ClassLoader
は、実際にはリークを発生させる役割を果たさず、 この追加の参照チェーンのためにリークを悪化させるだけです。
ClassLoader
→読み込んだ全てのクラス 特にJava 7以前の多くのJVMの実装では、さらに悪いことに、クラスと
ClassLoader
はそのままpermgenに割り当てられ、ガベージコレクトされることは全くありませんでした)。
このパターンのバリエーションとして、アプリケーションコンテナ(Tomcatなど)で、たまたま
ThreadLocal
が、何らかの形で自分自身を指しているのです。これは多くの微妙な理由で発生する可能性があり、しばしばデバッグや修正が困難です。
更新情報 : たくさんの方からご要望をいただいているので この動作を示すサンプルコードを以下に示します。 .
関連
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
final, finally, finalizeの違いについて話してください。
-
Methodのinvokeメソッド実装のJavaリフレクション
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
自動配線された依存性のインジェクションに失敗しました。
-
javaでクラスを作成すると、enclosing classでないように見える
-
JSPで「リストが型解決できない!」の解決方法
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決
-
[解決済み】Java HashMapは、同じハッシュコードを持つ異なるオブジェクトをどのように処理するのですか?
-
[解決済み] JVMをクラッシュさせるには?