2016-11-02 15 views
0

2Gの新しい世代のメモリを使用する前に、マイナーなgcが10秒ごとに発生し、毎回0.1-0.15秒かかることがわかりました。 3Gへの新しい年齢の記憶。その後、わずかなgcが15秒ごとに発生しますが、完了するまでには約0.3秒かかります。なぜ私が新しい年齢の記憶を増やす​​とマイナーなGC時間が増えるのですか?私はメモリを増やした後、GC後のアクティブなオブジェクトが55Mから80Mに増加したことに気付きましたが、その理由は何ですか?新しい世代のメモリを増やすとマイナーなGC時間が増える理由

+0

*「マイナーgcは10秒ごとに発生し、それぞれ0.1〜0.15秒かかる」* - これはGCで費やした壁時間の1〜1.5%です。なぜあなたはそれより少ない休止を望んでいますか?要求待ち時間が懸念される場合は、個々の休止時間を短くするのではなく、 – the8472

+0

@ the8472、私のサーバーのCPU負荷は非常に高いですが、多くのメモリリソースが使用されていません。私はCPU負荷を減らすためにGCを減らしたい、良い考えではないようだ。 – Xilang

答えて

4

これは、大きなメモリ領域に多くのライブオブジェクトが存在するためです。 GC時間は主に、生き残り領域にコピーする必要があるライブオブジェクトの数(および全体のサイズ)と比例します。

より大きな若い世代の地域から利益を得ることができるのは、すべてが同時に生きていて、YGに完全に収まらない多くのオブジェクトを作成する場合だけです。そうすれば、彼らは旧世代に勤め続けることができます。

それ以外の場合、合計GC時間は変わらず、時間のかかる、より少ない頻度での、より少ない頻度での、より短い頻度での、より短い頻度での頻度の高いイベントへの分割方法を選択するだけです。

+0

私のアプリケーションロジックは非常に単純で、リクエストを受信し、受信したデータを変換し、別のサーバーに送信するだけです。だから、ライブオブジェクトは、リクエストの処理が完了した後、すべてのオブジェクトが解放されるため、処理されているリクエストの数に依存します。 1秒あたりのリクエストが同じ場合、メモリ領域が増加するとライブオブジェクトが増加する理由は何ですか? – Xilang

+0

あなた以外の誰かが見つけることができないことはほとんどありません。私が記述したように、おそらくテニュアが少ないのでしょうか? –

+0

私はYGメモリを変更する前後に関係なく、gcログにテンディングの詳細を表示しますが、OGにはほとんどテニュアされていません。実際、ほぼすべてのオブジェクトは0歳または1歳で収集されます。違いは2G YG、1歳オブジェクトは約55M、3G YGでは1歳オブジェクトは約80Mです。 – Xilang

1

若いコレクション間の時間を長くしたい場合は、Edenサイズを大きくする必要があります。若い世代のサイズを変更すると、生存者のスペースのサイズとテンジングのしきい値の2つの変更もありそうです。テンションをつけることにより、テンポラリ空間に昇格される前に、オブジェクトが生存スペース間で何回コピーされるかが決まります。デフォルトのテンリングしきい値は4ですが、指定する場合を除いて、-Xmnなどの特定のパラメータでテンリングしきい値が15に変更されます。

-XX:SurvivorRatio=8フォームの例を設定することでEdenのスペースを増やし、テールディングのテールディングを-XX:MaxTenuringThreshold=4に制限することができます。テナントのしきい値を下げるのは、Full GCを圧迫するテナリングスペースにオブジェクトを増やすことです。

GCの保有を試みる前に、私は常に割り当てを見ているメモリプロファイルを実行することをお勧めします。フライトレコーダーで。多くの場合、ごみの量を2〜4倍減らすことができます。これにより、アプリケーションの調整がはるかに簡単になります。

+0

GCログでは、2Gと3Gの両方のケースで、テンシングのしきい値が6であることがわかりました。 OGには、ほとんど何もテニュアされていません。実際、ほぼすべてのオブジェクトは0歳または1歳で収集されます。違いは2G YG、1歳オブジェクトは約55M、3G YGでは1歳オブジェクトは約80Mです。 – Xilang

関連する問題