1

実行するたびに100ミリ秒未満でコードを2秒ごとに実行するスロット付きJavaシステムがあります。その 100 ミリ秒の実行中にガベージ コレクションを実行することは避けたいのですが、システムが空いている残りの 1.9 秒で実行します。現在、ガベージ コレクションはその 100 ミリ秒の間に実行される可能性があり、さらに約 100 ミリ秒追加されますが、これは私の場合は受け入れられません。

プログラムのメモリ使用量は約 2G で、その 100 ミリ秒の間に多くの小さなオブジェクトが作成される場合があります。また、マルチコア システム (4 コア以上) でも実行します。

4

2 に答える 2

1

-XX:+UseParallelGC と -XX:+UseOldParallelGC を試して、GC の一時停止を最小限に抑えます。マルチギガバイトのヒープ用に設計されており、個別のスレッドでガベージ コレクションを並行して実行します。その目標は、「ストップ・ザ・ワールド」コレクションを回避し、GS の一時停止を最小限に抑えることです。

于 2013-11-11T04:50:23.783 に答える
1

これは、 System.gc() の呼び出しが役立ついくつかのケースのように見えます。必ず役立つという保証はありませんが、試してみる価値はあります。

私が最近提案したハックを試すこともできます。もう少し複雑で、逆効果になる可能性があります。

  • アイドル期間中に多くのメモリを割り当てます。
  • オブジェクトが古い世代にプロモートされないようにします (GC はコストがかかるため)。
  • 割り当て全体を最適化して取り除くことができないことを確認してください (次のようなことsum += new byte[123456].hashCode()を行う必要があります)。
  • GC を開始するのに十分な量を割り当てたら停止します。これはトリッキーな部分です:
    • ファイナライザー (またはそれ以上ReferenceQueue<PhantomReference>) を使用できますが、GC の直後に実行されるという保証はありません。
    • 見ることはできますがruntime.getFreeMemory、それが確実に機能するかどうかは誰にもわかりません。
    • GarbageCollectorMXBeanを試すことができます
    • -XX:+UnlockDiagnosticVMOptions -XX:+PrintGC最後の手段として、外から見ることができます

私が言ったように、それは正気の解決策が機能しない場合の単なるハックです。

于 2013-11-11T06:24:20.173 に答える