调查jvm高CPU使用率

时间:2016-01-28 11:19:30

标签: java jvm cpu-usage stack-trace

我有一个jvm进程,不断消耗单个cpu核心。我检查了java线程,似乎没有正在运行的操作,因此看起来加载来自本机线程。

我尝试使用pstack:mongoose.connect(database.url); ,但它返回了我没有帮助的地址列表:

pstack <thread_id>

接下来我该怎么办?据我所知,使用符号将adddresses转换为可读名称可能会有所帮助,但我不确定它们是否存在于jvm中。

另一个选择是让jvm打印内部状态,但我不确定这些命令是否存在。

感谢任何信息。

我正在使用1.7.0_80 jdk:

#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 ?? ()

在docker(1.9.1)容器中:

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

3 个答案:

答案 0 :(得分:2)

您可以尝试在jvisualvm中激活CPU配置文件,请参阅https://visualvm.java.net/profiler.html

答案 1 :(得分:2)

JVM附带的最佳免费工具是Mission Control中的Flight Recorder,即jmc它具有更低的开销,并且通常包括对象分配的位置等更精细的细节。

如果您的CPU使用率很高,我通常首先从对象分配开始,因为这通常会产生快速获胜。只有在清理了分配率后,才能查看CPU分析。

Java 8有一个更好的Mission Control 5.5版本,尽管Java 7仍然正常。

答案 2 :(得分:1)

pstack需要符号,对于JITed代码,它们不可用。您可以使用jstack代替它在运行时获取必要的信息。

除了特定于Java的分析器 - 例如jmc,jprofiler或yourkit - linux perf tools也是一个选项,因为他们可以使用perf-map-agent来获取符号。