dev
Java Basics - JVM Troubleshooting
Problem
-
PS报警,某个任务处理时间过长,2小时了还没好
-
上线查日志,发现卡在“计算衍生品数据”。
-
观察 cpu 和 memory 使用情况:内存高占用,cpu低占用
-
cpu + memory
-
top
-
grafna
-
visualvm
-
内存
-
ps -eo pid,cmd,%men,%cpu —sort=-%men | head
-
观察 gc 情况:发现频繁 full gc,停顿时间大于1s,G1
-
jstat: -gcutil
-
查看 heap 快照:发现高占用类 InstrumentCache
-
jmap: -histo:live
-
结合代码,发现是该类新加了一个属性 date 的问题,类型为 LocalDateTime,判断两个值是否相等精确到毫秒,所以当天的同一条 Instrument 有多条重复的记录。一共20w条数据量,额外的内存使用从 1G -> 10G,拉爆了 memory。
Changes
- 解决1:临时扩容,-xmx 20 -> 30
- 解决2:改写compareTo方法;增加压测机制