考虑方面
- 考虑内存分配确实过小。
- 内存泄露
- 对象频繁申请没有释放,比如从DB加载几万行记录,线程池的等待队列暴增的问题。
- 资源频繁申请没有释放,比如不断创建线程,发起socket。
排查步骤
- jps
- 定位jvm进程的PID
- jmap -heap pid
- 查看jvm中的新老代的堆内存配置,和使用情况(判断是否分配过小)。
- jmap -histo:live pid | more
- 查看jvm中存活对象的信息,并按内存占用大小排序。
- 实例数
- 占用内存
- 类名
- 针对占用内存较多的实例进行针对性review,如果是业务类的话就更容易看出问题。
- 注意:该命令会执行一次fgc,注意线上影响。
- 查看jvm中存活对象的信息,并按内存占用大小排序。
- jmap -dump:format=b,file=m.dump pid
- 手动持久化内存快照
- 自动持久化内存快照
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=/home/liuke/jvmlogs/
- -XX:+HeapDumpOnOutOfMemoryError
- dump分析工具
- Eclipse Memory Analyzer
- MAT