0

レイテンシーを最適化しようとしているアプリケーションがあり、フル GC に費やされる平均時間を短縮したいと考えています。「XX:+UseParallelGC」を使用すると、次のようになります。

[myhost ~]$ /usr/local/jdk7/bin/jstat -gcutil 9793 1000
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00  49.57  95.93  93.32  99.48  10086  390.628   387 1005.334 1395.962
 56.99   0.00   7.42  93.32  99.48  10087  390.691   387 1005.334 1396.025
 56.99   0.00  22.19  93.32  99.49  10087  390.691   387 1005.334 1396.025
 56.99   0.00  36.28  93.32  99.49  10087  390.691   387 1005.334 1396.025
[myhost ~]$ ps -p 9793 -o etime=
 4-12:40:52

「-XX:+UseParNewGC -XX:+UseConcMarkSweepGC」の使用に切り替えると、より多くのフル GC が表示されます。

[myhost]$ /usr/local/jdk7/bin/jstat -gcutil 2514 1000
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.20    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.19    716   28.151    24   44.250   72.401
  0.00 100.00 100.00  99.62  24.19    716   28.151    24   44.250   72.401
  0.00   0.00   5.92  99.44  24.19    716   28.151    24   56.361   84.512
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00 100.00  99.66  24.19    718   28.221    26   56.417   84.638
100.00   0.00  34.98  99.87  24.20    720   28.319    27   68.708   97.026
100.00   0.00 100.00  99.87  24.20    721   28.319    28   68.708   97.026
100.00   0.00 100.00  99.87  24.20    721   28.319    28   68.708   97.026
100.00   0.00 100.00  99.87  24.20    721   28.319    28   68.708   97.026
100.00   0.00 100.00  99.87  24.20    721   28.319    28   68.708   97.026

これがヒープ設定です。

 -Xms256m -Xmx8192m -XX:PermSize=128m -XX:MaxPermSize=1024m

JDKを使用しています:

[myhost ~]$ /usr/local/jdk7/bin/java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=261346688 -XX:MaxHeapSize=4181547008 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

最初のインスタンスの稼働時間は 4 日以上です。2 番目のインスタンスは数分間しか稼働していませんでした。頻繁にフル GC を実行して大きな一時停止をしていることに気付いたので、設定を元に戻しました。

GC の統計が壁から外れないようにするには、ここで何を調整する必要がありますか?

4

2 に答える 2

0

人間工学に基づいて、アプリケーション属性に関連する GC の動作を調整できるデフォルトのプラットフォーム依存の選択と一緒に引数を提供できます。コレクターを変更しても、そのチューニングが実行される GC の数にどのように影響するかが特定されていないという事実は、コレクターの選択が間違っていることを示しているわけではありません。

動作に関して言えば、ConcMarkSweepGCはアプリケーションの一時停止時間を短縮しますが、生成された GC イベントではすべてを保証します。2 回目のテストでは、フル GC にかかる平均時間の改善が示されましたが、コレクターがメトリックを満たすためにどのように適応するかを確認するには、さらに長い時間テストする必要があります。

最近の履歴に基づいて、並行コレクターは、Tenured 世代が使い果たされるまでの残り時間と、並行収集サイクルに必要な時間の見積もりを維持します。これらの動的な見積もりに基づいて、Tenured 世代が使い果たされる前に収集サイクルを完了することを目的として、並行収集サイクルが開始されます。

それに加えて、GC にかかる時間 (コレクターの約束) と実行された GC イベントとの間の適切なバランスを得るために、いくつかのケース (他のコレクターのテストを含む) を実行する必要があります。次のように、オブジェクトがどのように昇格されるか (世代仮説に基づいて)、またはコレクターを実行する前に許容されるヒープ使用量を制御できます。

-XX:NewRatio=<N>
-XX:CMSInitiatingOccupancyFraction=<N>
于 2016-10-18T21:04:03.677 に答える