开发时,功能测试自测后,我把维护的代码移交给测试。测试反馈,同步数据时CPU过高。
1. top命令查看CPU使用情况:
2. ps -ef | grep java 查看该进程是哪个微服务的进程号。
3. jmap -heap 进程号 查看,发现新生代和老年代的使用率达到100%。
这时候明细是发现gc引发的cpu高,立马想到fullgc是不是太频繁了。
4. jstat -gc 进程号 5000
发现FGC增长的很快。
5. 因为懒得dump当时的内存情况,直接用JDK自带的“jvisualvm.exe”工具去分析:
发现数据在同步传输的过程中,内存逐步增加,大部分没有释放。
PS:当然也可以
jmap -dump:format=b,file=heapdump pid:将内存使用的详细情况输出到文件
然后使用jhat命令查看该文件:jhat -port 4000 文件名 ,在浏览器中访问http:localhost:4000/
总结:
该命令适用的场景是程序内存不足或者GC频繁,这时候很可能是内存泄漏。通过用以上命令查看堆使用情况、大量对象被持续引用等情况。
6.分析内存不断被占用的原因,全局变量的内存没有被释放,方法中的变量不会存在该情况。
通过快照的方式找到此处代码:
发现该代码中相关全局变量有被释放,但是下面有一段代码没有被别的地方使用到。经了解,这是一段无用的老代码。删除多处此代码,重新部署测试。
jvisualvm工具显示结果良好:
用top命令查看此时的CPU:
问题解决。
此处记录下调优时看过的相关优秀的文章:
JVM(Java虚拟机)优化大全和案例实战_AlexanderHu的博客-CSDN博客
Java问题诊断和排查工具(查看JVM参数、内存使用情况及分析等) https://www.cnblogs.com/z-sm/p/6745375.html