私は約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%を消費しているのか分からないので、これはあまり役に立ちません。
ここから私はこの問題をデバッグしようとしていますか?問題がなくなるかどうかを確認するために、実行中のスレッドを無効にすることができます。
- すべての起動を明示しません。そして
- これはしばらく時間がかかることがあり、私は、私が試した上でどのように、もう少し巧妙な何かを望んでいる
に現れる開始するために20〜30分かかります。
提案がありますか?
P.S.コード内でSystem.gc()を呼び出すことはありません。
です。私は約6000の小さいが、長命のオブジェクトを持っています。 G1 GCを使用して指定するにはどうすればよいですか? – JoshuaD
'-XX:+ UseG1GC'を使用してください –
私は今すぐそれを打ち、それがどのように進むのかを教えてあげます。本当にあなたの答えを受け入れることを望んで、ありがとう! – JoshuaD