我有一个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)
答案 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来获取符号。