[英]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 报告我们在 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.