记录一次CPU占用高,JVM堆占用异常修复

起初是运维监控到线上有一个小组件,CPU占用异常的高,占用了大概4个核心,安装了一个arthas 。查看了一下应用的面板,发现新生代、老年代占用都很高,GC线程占用了大量的CPU,(图不是但是的图,当时情况老年代99+ 新生带95+ 有3个GC 线程)


image.png

最开始是以为程序给的堆内存(512MB)不够,想要让运维调高内存,后面想了一下,这个程序的并发并不高,不太可能出现并发过高导致程序崩溃的现象,于是导出了程序的堆内存,并且下载到了本地
注 用JPS 查看进程IP,JPS需要使用启动JAR程序的用户才能看到相应的进程ID,用JMAP导出堆

jps 
jmap -dump:format=b,file=/path/heap.bin 进程ID
image.png

下载到本地以后用visualvm这个工具加载堆信息、
FILE -LOAD -选择堆文件,加载堆文件以后有三个模块占用的内存特别的大


image.png

点进其中一个查看


image.png

这个GCroot 为ConcurrenHashMap ,说明这个MAP很可能是一个成员变量


image.png

这里能看到详细的使用类
image.png

检查一下程序,这个问题是因为想要通过ScheduledFuture,对定时任务进行关闭,所以把这个变量加到了MAP,但是schedule执行完以后没有清理MAP里面的变量,在这个程序我不需要对schedule进行管理,所以把这一行注释掉了


image.png

保存运行了一个月,持续观察也没什么问题,问题解决
https://arthas.aliyun.com/doc/jvm.html
http://visualvm.github.io/

堆文件
链接:https://pan.baidu.com/s/1fg3PfBVuV9nb3lu4UILM-g
提取码:n873

你可能感兴趣的:(记录一次CPU占用高,JVM堆占用异常修复)