[英]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.