繁体   English   中英

如何在 Java Web 应用程序(在 Tomcat 中运行)中找到热点?

[英]How do I find hotspots in a java web application (running in Tomcat)?

我有一个 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 CPU 示例选项卡的屏幕截图

从截图中可以看出,尽管录制时只有一个线程是红热的,但所有线程都被标记为红热。 深入研究其中一个热门线程,VisualVM 报告我们在 sun.misc.Unsafe.park() 方法内部很热。 此法不是红热,而是石冷。

由于无法区分贡献 100% CPU 数字的热代码与阻塞等待外部事件的石头冷代码之间的区别,因此没有出现连贯的图片。

我需要对 jcmd 命令行进行哪些更改才能正确捕获 CPU 正在执行的操作?

我需要在 VisualVM 内部遵循什么替代过程来查找热代码,同时消除冷代码?

我没有看到Visual VM的实现,但是在CPU上采样的事件叫做jdk.ExecutionSample。

还有一个 jdk.NativeMethodSample 事件可用于查找卡在本机中的线程,但 JVM 无法确定它们是否正在运行,因此它们不应成为可视化的一部分。

如果是,您可以使用 JDK Mission Control 解决该错误,或​​者更改配置以便不记录事件。 查看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 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM