2016-12-18 9 views
2

私たちのアプリケーションはレイテンシが重要です。 GCの一時停止を減らすために、オブジェクトを再利用します。プロセスの始めに、小さなオブジェクトをたくさん割り当ててから、(ほとんど)割り当てられていないメモリを割り当てます。しかし、私はまだgcのログを次のように表示しています。GCの一時停止を回避するにはどうすればよいですか?

2016-12-18T13:51:48.650+0200: 1.085: Total time for which application threads were stopped: 0.0001411 seconds, Stopping threads took: 0.0000203 seconds 
2016-12-18T13:51:48.776+0200: 1.210: Total time for which application threads were stopped: 0.0002027 seconds, Stopping threads took: 0.0000183 seconds 
2016-12-18T13:51:48.894+0200: 1.328: Total time for which application threads were stopped: 0.0002559 seconds, Stopping threads took: 0.0000194 seconds 
2016-12-18T13:51:48.906+0200: 1.341: Total time for which application threads were stopped: 0.0002159 seconds, Stopping threads took: 0.0000199 seconds 
2016-12-18T13:51:49.047+0200: 1.482: Total time for which application threads were stopped: 0.0002842 seconds, Stopping threads took: 0.0000208 seconds 

これまでのところ、JVMはすべての参照とマークオブジェクトに対して実行するプロセスを停止します。それが正しいか?

また、このようなログの頻度は時間とともに減少しています。だから私はGCがいくつかの内部パラメータをチューニングし、私はそれらを最初に提供したいと思います。今度は次の引数を使ってプロセスを実行します:

-Xms10240m 
-Xmx10240m 
-server 
-XX:+UseG1GC 
-noclassgc 

GCの詳細に関するすべての引数はありません。私たちのマシンには、gcを完全に回避するのに十分なメモリがあります。どのように私はそれをjavaに説明できますか?

OS:Linux、JVM oracle or openJDK。

ありがとうございます。

+0

0.0002842秒が長すぎますか? – Andreas

+0

280ミル、私たちにとっては長すぎます。 –

+0

0.0002842秒は**ではありません** 280ミリ秒です。それは280マイクロ秒**、別名0.28ミリ秒です。 – Andreas

答えて

2

これらは必ずしもガベージコレクションではありません。

JVMがTotal time for which application threads were stoppedを印刷する場合、他の多くのケースがあります(GCには関係しません)。詳細は、the related answerを参照してください。

非GCセーフポイントは、アプリケーションの起動時に、クラスのロードと再コンパイルのために特に頻繁に発生します。

GCの一時停止を追跡する場合は、-XX:+PrintGCDetailsを使用してください。非GCのsafepointsの数を減少させる

更新

いくつかのトリック:

  • -XX:-UseBiasedLockingが完全にバイアス失効一時停止を無効にし、
  • -XX:+UnlockDiagnosticVMOptions -XX:GuaranteedSafepointInterval=0毎秒義務的なセーフポイントを無効にします。
  • -XX:-TieredCompilationは、多層コンパイルを無効にし、再コンパイルに関連するセーフポイントの数を減らします。

注:これは単なるヒントに過ぎず、本番用としての示唆ではありません。上記のオプションにはパフォーマンス上の副作用があります。

関連する問題