簡體   English   中英

調查JVM高CPU使用率

[英]investigate jvm high cpu usage

我有一個不斷消耗單個cpu內核的jvm進程。 我檢查了Java線程,似乎沒有正在運行的操作,因此負載似乎來自本機線程。

我嘗試使用pstack: pstack <thread_id> ,但是它返回了我的地址列表,但不是很有幫助:

#0  0x00007fcc33c2b694 in ?? ()
#1  0x00007fcc3011f540 in ?? ()
#2  0x00007fcc2c032710 in ?? ()
#3  0x00007fcc3011f560 in ?? ()
#4  0x00007fcc33c6eaa0 in ?? ()
#5  0x00007fcc3011f560 in ?? ()
#6  0x00007fcc3011f7f0 in ?? ()
#7  0x00007fcc346414d0 in ?? ()
#8  0x00007fcc34641bf8 in ?? ()
#9  0x00007fcc3011f570 in ?? ()
#10 0x00007fcc33c83618 in ?? ()
#11 0x00007fcc3011f5a0 in ?? ()
#12 0x00007fcc33c6ea66 in ?? ()
#13 0x00000006b73ce4b0 in ?? ()
#14 0x00007fcc3011f7f0 in ?? ()

接下來我該怎么辦? 據我了解,使用符號將地址轉換為可讀名稱可能會有所幫助,但我不確定jvm是否存在它們。

另一個選擇是讓jvm打印內部狀態,但是我不確定是否存在這樣的命令。

任何信息表示贊賞。

我正在使用1.7.0_80 jdk:

# ./java -version
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)

在docker(1.9.1)容器中:

# uname -a
Linux 259307ada273 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

您可以嘗試在jvisualvm中激活CPU分析,請參閱https://visualvm.java.net/profiler.html

JVM附帶的最好的免費工具是Mission Control中的Flight Recorder,即jmc它的開銷要低得多,並且通常包括對象分配位置在內的詳細信息jmc少得多。

如果您有很高的CPU使用率,我通常首先從對象分配開始,因為這通常會帶來快速的成功。 只有清除分配速率后,我才能查看CPU配置文件。

盡管Java 7仍然可以正常運行,但是Java 8具有更好的Mission Control 5.5版本。

pstack需要符號,對於JIT代碼,它們不可用。 您可以使用jstack代替,它會在運行時獲取必要的信息。

除了特定於Java的探查器(例如jmc,jprofiler或yourkit)外,Linux perf工具也是一個選擇,因為它們可以使用perf-map-agent獲取符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM