2

これは私の質問に関連しています。JavaExcelPOIは、quartzによる複数の実行後に停止します

数回繰り返すと、プログラムが予期せず停止します。プロファイリングを試したところ、反復ごとに大量のヒープメモリを消費していることがわかりました(そして、どこかでメモリリークが発生しました。まだバガーが見つかりませんでした)。そこで、一時的な解決策としてSystem.gc();、プログラムの完全な実行の最後に挿入してみました(プログラムの簡単な説明については、リンクされた質問を読んでください)。私はあまり期待していませんでした。おそらく、各反復の後にさらにいくつかのヒープスペースが利用可能になるでしょう。しかし、を挿入すると、プログラムが使用するヒープメモリが少なくなるようSystem.gc();です。

ここに画像の説明を入力してください

上のグラフは実行中のプログラムを示し、System.gc();下のグラフは実行されていないプログラムを示しています。ご覧のとおり、上のグラフは、プログラムの4回の反復後に100 mb未満しか使用していないことを示していますが、下のグラフは、同じ反復回数で100mbを超える使用量を示しています。System.gc();誰かが私のヒープでこの効果を引き起こす方法と理由を明確にできますか?プログラムでこれを使用した場合に不利な点はありますか?それとも私はプログラミングに完全に絶望的で、代わりに写真を撮りますか?

各プログラムの反復の最後にGCを挿入したことに注意してください。したがって、ヒープの使用量は、System.gc();コマンドを満たすまでGCを挿入しない場合と同じである必要があると思います。

ありがとう!

4

3 に答える 3

1

Java の仕様によると、gc() を呼び出しても実行されることは保証されません。実行する必要があることを JVM に示唆するだけなので、結果は信頼できません (何があっても gc() を呼び出すことは避けてください)。しかし、あなたのケースでは、ヒープが徐々に限界に達しているため、ヒントが実行されている可能性があります。

通常、GC は特定のアルゴリズムに基づいて実行され、ヒープが使い果たされるのを防ぎます。必要なスペースを再利用できず、アプリが生き残るためのヒープがなくなると、OutOfMemoryException.

GC の実行中、アプリケーションはアクティビティの結果として一時停止するため、これ以上頻繁に実行する必要はありません。

最善の策は、リークを解決し、健全なランタイム エクスペリエンスのためにメモリ管理を改善することです。

于 2013-01-02T08:11:10.410 に答える
1

誰でも System.gc(); の方法と理由を明確にできますか? 私のヒープでこの効果を引き起こしますか?

System.gcガベージ コレクタが実行する一種のリクエスト サービスです。ステートメントでrequestはなく andを使用していることに注意してください。triggerヒープ状態に基づく GC は、コレクションを実行する場合と実行しない場合があります。

これを自分のプログラムで使用した場合、不利な点はありますか?

経験上、GC は放っておくと最も効果的です。あなたの例では、心配したり使用したりしないでくださいSystem.gc。GC は実行するのが最適なときに実行され、手動で要求するとパフォーマンスが低下する可能性があるためです。ほんのわずかな違いですが、最初のグラフよりも下のグラフの方が「gc に費やされた時間」が優れていることがわかります。

メモリによると、両方のグラフは問題ありません。最大ヒープが少し高いようです。したがって、GC は 2 番目のグラフでそれを実行しませんでした。本当に必要な場合は、それを実行したでしょう。

于 2013-01-02T08:29:34.457 に答える
0

System.gc()を使用しても、JVMに割り当てられたヒープサイズに影響はありません。ヒープサイズは、JVMに提供する起動引数にのみ依存します。同じプログラムを3〜4回実行し、System.gc()を使用した場合と使用しない場合の平均値を取得することをお勧めします。

メモリリークを見つける問題に戻ります。正確なメモリフットプリントを教えてくれるJProfilerまたは他のツールを使用することをお勧めします。ヒープ内のさまざまなオブジェクト。

最後になりましたが、重要なことです。あなたは合理的なプログラマーです。写真撮影に行く必要はありません:)

于 2013-01-02T08:21:25.283 に答える