起初是運維監(jiān)控到線上有一個小組件掀抹,CPU占用異常的高,占用了大概4個核心心俗,安裝了一個arthas 傲武。查看了一下應用的面板,發(fā)現新生代城榛、老年代占用都很高揪利,GC線程占用了大量的CPU,(圖不是但是的圖狠持,當時情況老年代99+ 新生帶95+ 有3個GC 線程)
最開始是以為程序給的堆內存(512MB)不夠疟位,想要讓運維調高內存,后面想了一下喘垂,這個程序的并發(fā)并不高甜刻,不太可能出現并發(fā)過高導致程序崩潰的現象绍撞,于是導出了程序的堆內存,并且下載到了本地
注 用JPS 查看進程IP得院,JPS需要使用啟動JAR程序的用戶才能看到相應的進程ID傻铣,用JMAP導出堆
jps
jmap -dump:format=b,file=/path/heap.bin 進程ID
下載到本地以后用visualvm這個工具加載堆信息、
FILE -LOAD -選擇堆文件祥绞,加載堆文件以后有三個模塊占用的內存特別的大
點進其中一個查看
這個GCroot 為ConcurrenHashMap 非洲,說明這個MAP很可能是一個成員變量
這里能看到詳細的使用類
檢查一下程序,這個問題是因為想要通過ScheduledFuture蜕径,對定時任務進行關閉两踏,所以把這個變量加到了MAP,但是schedule執(zhí)行完以后沒有清理MAP里面的變量兜喻,在這個程序我不需要對schedule進行管理梦染,所以把這一行注釋掉了
保存運行了一個月,持續(xù)觀察也沒什么問題朴皆,問題解決
https://arthas.aliyun.com/doc/jvm.html
http://visualvm.github.io/
堆文件
鏈接:https://pan.baidu.com/s/1fg3PfBVuV9nb3lu4UILM-g
提取碼:n873