2017-12-28 99 views
3

私は約20-30分の実行後に遅くなったり、あまりにも多くのCPUを使用したり、時間が経つにつれて悪化し続けるJavaプログラムを持っています。ガベージコレクタがCPUの90%を使用している理由を理解するにはどうすればよいですか?

私はOpen JRE 8_151を使用しているUbuntu Linux 17.10です。このバグは、Oracle JRE 8_131を使用しているウィンドウでも発生することを確認しました(私は8_151と仮定しています)。

私はプログラムがCPU(約90%)を多く使用していたまでは約45分を待っていたし、豚されている私のプログラム内のスレッドIDにしようとする次のアクションを取った:だから

ps aux 
#Visually confirm the process is using 90% and note ID -- 20316 

top -p20316 
#confirm usage, in top it says 366.3%; 4-core processor so this makes sense 

[while in top] press shift + H 
# See four threads each using about 85% 
    20318 
    20319 
    20320 
    20321 

# Convert those to hex 
    20318 -> 0x4f5e 
    20319 -> 0x4f5f 
    20320 -> 0x4f60 
    20321 -> 0x4f61 

[Exit top] 

jstack -l 20316 | less 
[press/and search for those hex thread ids] 

# Get the following results: 
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007ff9f8020000 nid=0x4f5e runnable 
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007ff9f8021800 nid=0x4f5f runnable 
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007ff9f8023800 nid=0x4f60 runnable 
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007ff9f8025000 nid=0x4f61 runnable 

それは私のCPUを使い果たしているガベージコレクタです。収集しているオブジェクトをどのスレッドが生成しているのか、またはガベージコレクトするためにプロセッサの消費電力の85%を消費しているのか分からないので、これはあまり役に立ちません。

ここから私はこの問題をデバッグしようとしていますか?問題がなくなるかどうかを確認するために、実行中のスレッドを無効にすることができます。

  1. すべての起動を明示しません。そして
  2. これはしばらく時間がかかることがあり、私は、私が試した上でどのように、もう少し巧妙な何かを望んでいる

に現れる開始するために20〜30分かかります。

提案がありますか?

P.S.コード内でSystem.gc()を呼び出すことはありません。

答えて

2

長寿命のオブジェクトが非常に多いかどうかを確認してください。これは、世代のガベージコレクタにとっては致命的なケースです。この場合、G1 GCを使用してみてください。

+0

です。私は約6000の小さいが、長命のオブジェクトを持っています。 G1 GCを使用して指定するにはどうすればよいですか? – JoshuaD

+1

'-XX:+ UseG1GC'を使用してください –

+0

私は今すぐそれを打ち、それがどのように進むのかを教えてあげます。本当にあなたの答えを受け入れることを望んで、ありがとう! – JoshuaD