私のコードは基本的にApache Spark上で動作しており、各コンテナは別々のJVM上で動作します。コンテナには一定のメモリ制限を指定します。私のプログラムでは、コンテナは1つのタスクを正常に終了しますが、別のタスクを実行しようとすると、メモリ制限を超えたとクラッシュします。別々のコンテナでそれぞれのタスクを実行すると、それらは常に正常に動作します。だから、私はコードで把握することができないタスクが終了した後に閉じられていないリソースが残っているように見え、クローズされていないリソースはコンテナのメモリを増加させます。ですから、私の質問は、JVMにすべてのリソースを強制的に閉じるようにJavaに指示する方法があるかどうかです。ガベージコレクションを強制することもできますか?私はこれらの2つのステップを各タスクの最後に実行したいと思います。メモリが不足実行している場合、Javaはごみは収集し、唯一失敗します -Javaのクローズされていないリソースをすべて強制的に閉じる
0
A
答えて
2
にトライして、リソースを使用することができますこれには時間がかかりすぎる場合。しかし、あなたがそれを記述する方法では、はおそらくリソース(=ファイル、ソケットなど)が開いていませんが、大きなオブジェクト到達可能です。返されたオブジェクトが不要な中間データを参照しておらず、定数以外の値をstatic
変数に格納しないようにしてください。
visualvm
またはヒープダンプを生成して、どのオブジェクトがあなたのメモリを奪うかを見つけることができるもの。
私はScalaにこの機能がないことを知っています。しかし、Javaの8はトライして資源として知られている自動閉鎖外部リソースのための優れた機能を持っています。このブロックを出るとき
try(AutoCloseable foo = openSomeResource()) {
doSomething();
}
は自動的にどんなに(例えば例外、リターン)、foo.close();
を呼び出しません。このパターンに従えば、リソースを開いたままにするのは難しいです。しかし、これはJavaの "リソース"と呼ばれ、これらはAutoCloseable
インターフェイスを実装する必要があります。リソースは開かれていませんが、到達可能なオブジェクトがあります。おそらくJava/Scalaのメモリリークをデバッグする方法に関するチュートリアルがたくさんあります。しかし、通常、最初の手順は、ヒープダンプを取得して、どのくらいのメモリを使用しているかを確認することです。特定のツール(例:hprof、JVM組み込み)では、アロケーションサイトに行番号を表示することさえできます。
0
たぶん、あなたはあなたがSystem.gc();
を実行することができますが、私はそれを助けるために起こっている疑いJDK7以上
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
関連する問題
- 1. すべてのExcelファイルを強制的に閉じるバッチ
- 2. Javaリソースのリークがクローズされていない
- 3. クローズされていないSVGパスが閉じているようです
- 4. ウェブブラウザを強制的に閉じる
- 5. アプリが強制的に閉じる
- 6. アンドロイドのsqliteアプリケーションがデバイスで強制的に閉じられています
- 7. 開いている場合は強制的にソケットを閉じる
- 8. SQLException:すべてのリソースを閉じてもデータベースがロックされています
- 9. すべてのスレッドが閉じているか、強制的にスレッドを閉じていることを確認しますか?
- 10. Javaで閉じられていないI/Oリソースを見つけるには?
- 11. 閉じるタブを閉じると、ユーザーを強制的にログアウトする方法
- 12. スイフト - 強制的にソケットを閉じないようにするにはどうすればいいですか?
- 13. System.Net.WebException:基になる接続がクローズされました:既存の接続がリモートホストによって強制的に閉じられました
- 14. cakephp:強制的にアンロード/クローズ接続を行います。
- 15. 強制的に閉じたTCP接続をエミュレートするには?
- 16. 強制的にアプリのキャッシュをクリアアプリを閉じる
- 17. 複数の強制閉じるが私のアプリケーションに入っています
- 18. オープン/ダングリングソケットを強制的に閉じる方法は?
- 19. usbドライブでファイルを強制的に閉じるbashコマンド
- 20. C#で強制的にOracle接続を閉じる
- 21. フォームを閉じるとき閉じる開いているすべてのメッセージボックスを閉じる方法を
- 22. 一般的な引数が強制されていません
- 23. jQueryを強制的に追加してタグを自動的に閉じないようにするにはどうすればよいですか?
- 24. キャッシュされていないgethostbyname()を強制する
- 25. Matrixを使用してビットマップを回転させて強制的にコードを閉じるコード
- 26. Docker sendビルドコンテキストが失敗する - 強制的に接続が閉じられる
- 27. JavaのURLを開いて閉じる
- 28. TabControlを強制的にすべてのTabItemをロードする
- 29. すべてのタイルを描画するグリッドを強制的に
- 30. すべてのユーザーエージェントのJavaScriptを強制的に生成する
いいえ、不要なオブジェクトをクリーンアップするためには、実際にプログラムで注意する必要があります。 Javaは、GCに適格なオブジェクトのメモリを解放します(ただし、OutOfMemoryエラーをスローする前にこれを確実に行います)。 – Thilo
OOMを実行して何が残っているのかを確認するために、ヒープメモリダンプを生成するようにJVMを設定することができます。そのための起動フラグがあります。 – Thilo
これらのリソースはあなたのプログラムによってまだ使用されている可能性があるので、一般的には "クローズされていないすべてのリソースを閉じる"ことはできません。 @Thiloが述べたように、実際のリークを分析するためのヒープダンプがおそらく最善の策です。 –