更多文章请关注我们的云计算频道:https://yq.aliyun.com/cloud
什么是OOM?
我想很多“程序员”都知道OOM异常对我们来说很常见。 “java.lang.OutOfMemoryError”是应用开发中比较常见的异常,主要分为三类:
1. OutOfMemoryError:永久代空间
2.OutOfMemoryError:Java堆空间
3. OutOfMemoryError:无法创建新的本机线程
OOM的危害
OOM 情况通常会导致以下情况:
1、应用服务异常
2. 线程异常
3、程序崩溃
如果你看看诸如此类的未知问题,我想你就会明白“OOM”的“可怕”了。
如何排查OOM问题
出现这个OOM问题,应该如何分析原因?还是直接看代码或者调整工程结构?我认为在很多情况下这种方法是浪费的。那么如何快速解决和识别这些类型的问题呢?
模拟异常场景
为了清楚地解释整个故障排除过程,我们将创建一个模拟OOM 场景的OutOfMemoryError 测试代码。
Servlet测试代码:
@Overridepublic class TestCase { public int id; public String[] array=new String[1024];web.xml 映射路径:
servlet 获取转储文件
转储文件是进程的内存映像,可以通过调试器将程序执行状态保存到转储文件中。这是开发人员发现JVM问题的“利器”。
方法一:edas控制台部署添加参数
要通过edas控制台部署并启动应用程序,请指定jvm参数,并在控制台中指定最大堆大小和初始堆大小为100m(请注意,当前设置的值仅用于测试目的)。
此外,您还可以自定义一些参数,例如:
-XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError XX:HeapDumpPath=/home/admin/dump/控制台设置:
PrintGCDetails 打印gc 日志。 XX:HeapDumpPath 指定在出现OOM 问题时在/home/admin/dump/中生成转储文件。
方法二:通过jmap获取
jmap是jdk自带的一个JVM发现工具。要通过jmap获取堆栈溢出转储文件,将代码更改如下:
@Override 访问测试代码条目并在应用程序服务器上运行它。
您可以使用jmap -dump:live,format=b,file=heap.bin pid 获取heap.bin 文件。
测试堆栈溢出
以管理员用户身份登录服务器,找到Tomcat 进程ID,运行./jstat -gcutil {pid} {时间间隔} 并观察gc 运行情况。
可见目前的YGC和FGC并不频繁,属于正常现象。
访问测试路径:http://{ip}:port/path/heap.htm
执行完成后,eden区和old区都瞬间被填满,可以看到短时间内多次出现FGC:
MAT记忆分析
mat是一个快速分析Java内存的工具,mat官网
在服务器上,可以在前面指定的路径下找到方法一生成的hprof文件:/home/admin/dump/。方法二:下载生成的heap.bin文件后,在MAT内存分析软件中打开。
垫子分析后,您可以立即得到分析报告。这表明堆栈溢出是由“HeapOutOfMemory.doGet”代码条目引起的。事实证明,我的代码中有一个无限循环,不断创建新类,导致堆栈溢出。 接下来,你需要知道如何修改代码。
小结
如果您遇到任何jvm 问题,请不要惊慌,这是一个潜在的技术问题。除了中描述的mat 内存分析工具之外,还有许多方法可以轻松识别原因。 JDK 本身还有许多其他小工具可供使用,例如jconsole、jmap、jstat、jinfo 和jvisualvm。充分利用这些小工具,下次遇到类似问题时,您将能够轻松使用它。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。