JVM热点CPU问题

VisualVM 能够监控应用程序在一段时间的 CPU 的使用情况,显示 CPU 的使用率、方法的执行效率和频率等相关数据帮助我们发现应用程序的性能瓶颈。我们可以通过 VisualVM 的监视标签和 Profiler 标签对应用程序进行 CPU 性能分析。

在监视标签内,我们可以查看 CPU 的使用率以及垃圾回收活动对性能的影响。过高的 CPU 使用率可能是由于我们的项目中存在低效的代码,可以通过 Profiler 标签的 CPU 性能分析功能进行详细的分析。如果垃圾回收活动过于频繁,占用了较高的 CPU 资源,可能是由内存不足或者是新生代和旧生代分配不合理导致的等。

在 Profiler 标签,点击“CPU”按钮启动一个 CPU 性能分析会话 ,VisualVM 会检测应用程序所有的被调用的方法。当进入一个方法时,线程会发出一个“method entry”的事件,当退出方法时同样会发出一个“method exit”的事件,这些事件都包含了时间戳。然后 VisualVM 会把每个被调用方法的总的执行时间和调用的次数按照运行时长展示出来。

此外,我们也可以通过性能分析结果下方的方法名过滤器对分析结果进行过滤。

JVM热点CPU问题_第1张图片

 

点击取样器Sampler, 点击“CPU”按钮,启动CPU性能分析会话,VisualVM 会检测应用程序所有的被调用的方法,

在CPU samples tab 下可以看到我们的方法AprEndpoint() 的自用时间最长, 如下图:

JVM热点CPU问题_第2张图片

cpu过高处理步骤:

 

1、top找出cpu高的java进程号:如 9592

2、ps -mp 14710 -o THREAD,tid 查看cpu占用time最高的线程编号28178

3、执行 printf "%x\n" 28178 获取线程十六进制地址6e12 (十六进制一定要小写)

 

4、执行jstack  pid 14710 > /DATA/home/test.txt

5、在文档内查找线程;

 

"http-bio-8121-exec-199" daemon prio=10 tid=0x00007f751804b800 nid=0x6e12runnab  le [0x00007f74ebcf9000]
   java.lang.Thread.State: RUNNABLE
        at com.ejavashop.model.seller.SellerTransportModel.getFee(SellerTransportModel.java:387)
        at com.ejavashop.model.seller.SellerTransportModel.calculateTransFeeFuil  (SellerTransportModel.java:312)
        at com.ejavashop.model.cart.CartModel.getCartInfoByChooseId(CartModel.ja  va:1134)
        at com.ejavashop.service.impl.cart.CartServiceImpl.getCartInfoByChooseAn  dId(CartServiceImpl.java:201)


5、排查代码SellerTransportModel.java:387

 

你可能感兴趣的:(Tomcat监控)