# 内存溢出宕机问题初探

# 背景:

内存溢出宕机,通常登录页无法打开,网页无任何响应。

控制台或者OA日志输出 java.lang.OutOfMemoryError: Java heap space 1657091125177.png

有时候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文件,如图: 1657091179917.png

上图中, javaw.exe文件路径根据实际情况修改,jdk1.8版本。 heapdump文件有多大,-Xmx8g 这个配置就改成多大,并且分析问题差不多需要这么大的内存。

打开heapdump文件后选择 Leak Suspects Report,Finish。 1657091202576.png

# 典型案例1:

最简单的案例,Problem Suspect,这里显示了一行 The stacktrace of this Thread is available. See stacktrace. 1657091225503.png

直接点击超链接 See stacktrace,此线程导致的问题,需要对应开发处理。

1657091239045.png

# 典型案例2:

Problem Suspect,Biggest instances,有非常多的线程信息: 1657091262190.png 1657091267945.png

去heapdump文件所在目录下取出threads文件看线程堆栈:

1657091280824.png

搜索线程关键字(0x7fea2f2767b0这样的字符串,前两张图里有很多)

1657091315897.png

1657091322666.png

以上代码导致的问题,需要对应开发处理

# 典型案例3:

Problem Suspect 5,点超链接 Details:

1657091357755.png

,这一行最后带了 Thread,说明有线程堆栈信息:

1657091370519.png

1657091375833.png

1657091382067.png

1657091386563.png

以上代码导致的问题,需要对应开发处理。

# 典型案例3有另一种分析方法:

1657091404585.png

1657091409456.png

下面这一步为什么选择incoming,见最后的参考:

1657091420552.png

1657091425331.png

1657091428845.png

1657091432867.png

1657091438107.png

参考:

https://blog.csdn.net/AlbertFly/article/details/51984882

1657091458086.png

创建人:zhangshuang
修改人:het