6

サーバーから大量のデータを消費する Java クライアントがあります。クライアントが十分な速度でデータ ストリームについていけない場合、サーバーはソケット接続を切断します。クライアントが 1 日に数回切断されます。jconsole を実行してメモリ使用量を確認したところ、ヒープ スペース グラフはかなり明確に定義されたノコギリ波パターンのように見え、約 0.5GB から 1.8GB の間で振動しています (2GB のヒープ スペースが割り当てられています)。しかし、切断されるたびに、完全な GC が実行されます (すべての完全な GC ではありません)。完全な GC には平均で 1 秒以上かかることがわかります。時間帯にもよりますが、フル GC は忙しいときは 5 分おきに発生し、遅い時間帯にはフル GC の間に最大 30 分かかることがあります。

完全な GC 時間を短縮できれば、クライアントは受信データにうまく対応できるようになると思いますが、GC チューニングの経験はあまりありません。これが良いアイデアであるかどうか、またその方法について誰かが洞察を持っていますか? または、同様に機能する可能性のある別のアイデアはありますか?

** 更新 ** -XX:+UseConcMarkSweepGC を使用したところ、改善されましたが、非常に忙しいときに切断されました。そのため、忙しい時期を乗り切るためにヒープ割り当てを 3GB に増やしました。現在はかなり順調に進んでいるようですが、切断されなかったのは 1 日だけです。たぶん、時間があれば、作成されるゴミの量を減らすように努めますが、これも役立つと確信しています. すべての提案をありがとう。

4

3 に答える 3

5

フル GC を調整するのは簡単ではありません。はるかに優れたアプローチは、ガベージの生成を減らすことです。ガベージの生成が少なくなれば、収集コストが高くなる保有空間にオブジェクトを渡すというコレクションへの圧力が軽減されます。

メモリプロファイラーを使用することをお勧めします

  • 発生するゴミの量を減らします。多くのアプリケーションでは、これは比較的簡単に 2 ~ 10 分の 1 に減らすことができます。
  • 作成するオブジェクトのサイズを小さくします。たとえば、BigDecimal の代わりに double のようなプリミティブで小さいデータ型を使用します。
  • 変更可能なオブジェクトを破棄する代わりにリサイクルします。
  • 可能であれば、クライアントに保持するデータを減らします。

作成するガベージの量を減らすことで、オブジェクトがエデンまたはサバイバー スペースで消滅する可能性が高くなります。

多くのコレクションと一緒に暮らさなければならないことを当然のことと考えないでください。極端な場合には、それをほぼ完全に回避できます

于 2013-05-21T19:12:50.473 に答える
2

Runtime.getRuntime().gc() への呼び出しを取り出す - ガベージ コレクションが手動でトリガーされると、何もしないか、完全なストップ ザ ワールド ガベージ コレクションを実行します。インクリメンタル GC を実行したい。

jdk インストールからサーバー jvm を使用してみましたか? デフォルトの構成設定 (ガベージ コレクションを含む) を変更し、簡単に試すことができます。Java コマンドに -server を追加するだけです。

java -server

作成されるすべてのゴミは何ですか? それを減らすことはできますか?可能であれば、valueOf メソッドを使用してみてください。使用するメモリを減らすことで、gc とメモリ割り当ての時間を節約できます。

于 2013-05-21T20:19:28.100 に答える