一、问题解决思路
1.遇到内存溢出问题首先应该去查看debug日志,一般都会有相关报错信息。找不到再去查看gc.log和dump文件,如果系统没生成gc.log文件需要添加配置,下次内存溢出后就可以看到日志了。
-Xloggc:./temp/gc.log
-XX:HeapDumpPath=./temp/dump.hprof
2.通过在gc.log搜索FuIl GC等关键词,可以知道发生的时间点,然后可以去指定时间搜索相关debug日志,模糊的定位到问题代码,结合dump文件和实际的代码确认问题所在。
二、内存分析
1.生成dump文件
通过ps命令找到指定应用pid带入jmap命令即可
ps -ef|grep java
jmap -dump:format=b,file=heap.hprof pid
2.使用工具分析dump文件
(1)这里推荐常用的Jprofiler,附上下载地址:https://www.ej-technologies.com/jprofiler/download
(2)Jprofiler官网介绍文档:https://www.ej-technologies.com/resources/jprofiler/help/doc/main/introduction.html
(3)直接使用Jprofiler打开即可.hprof文件即可。
J
①查看占比较多的类,后面有用
②查看大对象
③对大对象进行引用分析
④可以一步步点进去,或者使用图表去分析最终的引用,发现就是第一步发现的那些占用较多的类。
3.结合使用的内存配置分析大对象
例:jvm配置为server -Xms1024M -Xmx1024M -Xmn512M -Xss512K,而大对象为ibatis相关对象,推测为数据库中的数据过一次性查的太多,或者请求数据库次数太多。
(1)分析内存配置
①初始堆内存(Initial Heap Size, -Xms) 和 最大堆内存(Maximum Heap Size, -Xmx&