# 内存溢出宕机问题初探
# 背景:
内存溢出宕机,通常登录页无法打开,网页无任何响应。
控制台或者OA日志输出 java.lang.OutOfMemoryError: Java heap space
有时候java会自动dump,如以上截图,产生了一个java_pid20487.hprof文件;
若未自动完成,可以手工导出heapdump文件,jdk/bin目录下执行命令:
jmap -dump:format=b,file=文件名.bin java进程pid数字
内存溢出问题通常必须要分析heapdump文件。
# 分析工具:
通常用 MemoryAnalyzer,俗称MAT,下载地址: https://www.eclipse.org/mat/downloads.php https://www.eclipse.org/mat/previousReleases.php 下载后配置其中MemoryAnalyzer.ini文件,如图:
上图中, javaw.exe文件路径根据实际情况修改,jdk1.8版本。 heapdump文件有多大,-Xmx8g 这个配置就改成多大,并且分析问题差不多需要这么大的内存。
打开heapdump文件后选择 Leak Suspects Report,Finish。
# 典型案例1:
最简单的案例,Problem Suspect,这里显示了一行 The stacktrace of this Thread is available. See stacktrace.
直接点击超链接 See stacktrace,此线程导致的问题,需要对应开发处理。
# 典型案例2:
Problem Suspect,Biggest instances,有非常多的线程信息:
去heapdump文件所在目录下取出threads文件看线程堆栈:
搜索线程关键字(0x7fea2f2767b0这样的字符串,前两张图里有很多)
以上代码导致的问题,需要对应开发处理
# 典型案例3:
Problem Suspect 5,点超链接 Details:
以上代码导致的问题,需要对应开发处理。
# 典型案例3有另一种分析方法:
下面这一步为什么选择incoming,见最后的参考:
参考:
https://blog.csdn.net/AlbertFly/article/details/51984882