dev

Java Basics - JVM Troubleshooting

/note-bak/dev/java/jvm-troubleshooting/

Problem

  1. PS报警,某个任务处理时间过长,2小时了还没好

  2. 上线查日志,发现卡在“计算衍生品数据”。

  3. 观察 cpu 和 memory 使用情况:内存高占用,cpu低占用

  4. cpu + memory

  5. top

  6. grafna

  7. visualvm

  8. 内存

  9. ps -eo pid,cmd,%men,%cpu —sort=-%men | head

  10. 观察 gc 情况:发现频繁 full gc,停顿时间大于1s,G1

  11. jstat: -gcutil

  12. 查看 heap 快照:发现高占用类 InstrumentCache

  13. jmap: -histo:live

  14. 结合代码,发现是该类新加了一个属性 date 的问题,类型为 LocalDateTime,判断两个值是否相等精确到毫秒,所以当天的同一条 Instrument 有多条重复的记录。一共20w条数据量,额外的内存使用从 1G -> 10G,拉爆了 memory。

Changes

  1. 解决1:临时扩容,-xmx 20 -> 30
  2. 解决2:改写compareTo方法;增加压测机制