繁体   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