前言
前些日子,左羊所在团队遇到一个问题。我们的一个权限修改接口近期总是发生请求超时的请求超时的情况,我的前辈King在和同僚们讨论这个情况时发现了在旮旯(ga三声、la二声)敲着代码咬着手指的左羊,所以就如同大多数剧情发展一样这个任务有幸被我承接了。
接下就是一些诸位都懂的问题定位操作了,排查日志、观察问题接口代码、DEBUG等常规操作,但这次有些尴尬了通过DEBUG的方式没能直观的定位到关键问题。这是我想之前用的Jstack[3]、Arthasv[4]等工具进行排查,但成片的代码与文字不如图表对人类视觉理解来的直接,所以左羊通过度娘、Google等工具了解到了jvisualvm可视化的JVM监视和分析工具,最终通过DEBUG结合jvisualvm的综合定位并解决了问题。
哦!对了。 这个问题是由JPA EnableJpaAuditing 审计功能@EnableJpaAuditing(auditorAwareRef = "auditorAware")和@JoinTable结合使用时,向Log文件写入日志时发生死循环导致内存溢出造成的,我们通过处理循环关系解决掉了,具体细节就不概述了,下面我们了解下jvisualvm吧。
jvisualvm面板
jvisualvm简介
jvisualvm是一个可视化的JVM监视和分析工具,它可以帮助开发人员进行各种性能分析和调试操作。使用jvisualvm,用户可以观察JVM中正在运行的进程的CPU使用率、内存使用量、线程状态和堆栈轨迹等信息,并根据这些信息来优化程序性能和调试问题。
jvisualvm具有以下主要功能
- 内存快照:生成JVM内存快照,跟踪内存泄漏和原因分析;
- 线程分析:定位线程问题,包括死锁、CPU占用过高等;
- 监控应用:监控应用服务器的状态,包括CPU占用率、线程数、GC相关信息等;
- 插件扩展:提供了多种插件来扩展其功能,例如Visual GC插件、Sampler插件等。
jvisualvm所在路径
jvisualvm可通过JDK自带的bin目录下的jvisualvm.exe启动,并且可以连接远程的JVM进程,以便于实时获取信息。
我的jvisualvm所在路径
C:\Java\jdk1.8.0_151\bin
jvisualvm所在路径
jvisualvm的使用
启动
双击这个EXE程序即可
EXE程序
进入面板双击你需要观察的JAVA进程
IDEA进程
概述页
这里能够看一些JVM参数等信息。
监控页
这里能够观测这个进度的CPU使用情况、堆信息、类信息、线程的线程变化图,我常用就是这个页面。
详细线程观察页
这里观察具体线程的详细情况。
抽样页
这里观察具线程对CPU或线程的详细使用情况。
参考文献
1. jvisualvm官方网站 . https://visualvm.github.io/
2. Java VisualVM . https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/index.html
3. 左羊 . jstack之记一次生产环境排查记录 . https://mp.weixin.qq.com/s?__biz=MzU0MTgwODAwNQ==&mid=2247484021&idx=1&sn=5c155432c42d513e95a918cb84ff327e
4. 左羊 . Java线上诊断工具-Arthas快用指南 . https://mp.weixin.qq.com/s?__biz=MzU0MTgwODAwNQ==&mid=2247484252&idx=1&sn=9d8046fbf39983446813497a138f0220