我有一个web应用程序,它执行特定任务所花费的时间比它应该花费的时间要长。我使用并发性为1的ab将web应用程序置于负载之下,我看到tomcat使用了100%的CPU。我想深入到应用程序并回答这样一个问题:“这段java代码做了什么,导致java代码消耗了100%的CPU?”
我尝试使用Java Flight Recorder来记录我的应用程序,如下所示:
-sh-4.1$ jcmd 115388 JFR.start duration=60s filename=/tmp/app-service-live.jfr settings=profile将生成的JFR文件加载到VisualVM中会得到以下结果:

如截图所示,尽管只有一个线程在录制时处于红色热状态,但所有线程都被标记为红色热状态。深入到一个红色的热点线程,VisualVM报告我们在sun.misc.Unsafe.park()方法中正在燃烧。这种方法不是热的,而是冷的。
由于无法区分导致100% CPU数字的热代码和等待外部事件而被阻塞的冷代码之间的区别,因此没有出现连贯的图景。
我需要对jcmd命令行进行哪些更改才能正确地捕获CPU正在执行的操作?
在消除冷代码的同时,我需要在VisualVM中遵循什么替代过程来查找热代码?
发布于 2020-10-31 04:48:59
我还没有见过Visual VM的实现,但在CPU上采样的事件称为jdk.ExecutionSample。
还有一个jdk.NativeMethodSample事件,可用于查找停留在本机中的线程,但无法确定它们是否正在运行,因此它们不应该是可视化的一部分。
如果是,您可以通过使用JDK work或更改配置来解决该错误,以便不记录该事件。查看JAVA_HOME/lib/jfr目录,将default.jfc复制到一个新文件,即my.jfc,然后切换到该文件,以便jdk.NativeMethodSample事件具有以下设置:
<setting name="enabled">false</setting>然后像这样运行它:
$ jcmd <pid> settings=my duration=60s ...您也可以将配置复制到另一个目录,但必须指定完整路径:
$ jcmd <pid> settings=/conf/my.jfc duration=60s ...https://stackoverflow.com/questions/64600421
复制相似问题