由于项目是在客户内网部署,只能通过运维了解信息,从运维那里了解到系统经常宕机并且有OOM的日志输出,那就可以通过JVM堆内存直接分析出原因了。
jps 查看java进程ID,找到进程id后
jmap -histo 14660 #查看历史生成的实例
jmap -histo:live 14660 #查看当前存活的实例,执行过程中可能会触发一次full gc
堆信息
jmap -heap 14660 //显示出各个生命分代区的现状
导出 堆内存dump
jmap -dump:format=b,file=eureka.hprof 14660
也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=./ (路径)
可以用jvisualvm命令工具导入该dump文件分析

最终定位到占用内存最大的业务系统的对象,然后通过代码发现有一个地方固定存入大Map到内存当中。优化思路是让这位同学采用ehcache缓存数据,这不会发生OOM,因为ehcache内部实现了LRU算法,会淘汰掉使用频率最少的数据。
参考文章:
Comments NOTHING