您的位置 首页 > 数码极客

【admin用户登录】快速查找EDAS- OOM问题的方法

请关注更深的句子,云计算频道。

什么是OOM?

我想很多“程序猿”都能知道。OOM以上,也就是我们常见的“JAVA . LANG . OUTOFMEMORYRROR”,是应用程序开发中比较常见的例外之一,主要分为三种。

1.out of memory error: perm genspace

2.out of memory error: Java heapspace

3.out of memory error:unable to create new native thread

OOM的危险

对于OOM,通常:

1、应用程序服务例外

2、线程异常

3、程序冲突。

还有其他未知的问题,我相信看到这几个就能感受到“OOM”的“恐惧”。

如何解决OOM问题

出现这个OOM问题的时候,应该怎么分析原因,就是去敲代码吗?还是去调整工程结构?我相信这种方式在很多情况下只是徒劳。那么,对于这样的问题,我们如何迅速调查位置呢?(莎士比亚)。

异常场景模拟

为了清楚地说明整个故障排除过程,我们编写了模拟oom方案的OutOfMemoryError测试代码。

servlet测试代码:

@ override public class test case { public int id;Public String namepublic string[]array=new string[1024];public liststringlist=new ArrayList(1024);Web.xml映射路径:

servlet将导入dump文件

Dump文件是进程的内存镜像,通过调试器可以将程序的执行状态保存到dump文件中,是开发人员查找JVM问题的“工具”。

方法1: edas控制台部署附加参数

通过启动Edas控制台部署应用程序,您可以指定JVM参数,在控制台上指定最大heap Size,并将Heap Size初始化为100m(当前配置的值仅供测试使用)。

您也可以自订下列参数:

-xx : printgcdetails-xx 3360 heapdumponoutofmemoryerror xx 3360 heapdumppath=/home/admin/dump/从控制台设置:

PrintGCDetails将打印GC日志。XX:HeapDumpPath指定dump文件存储路径,如果遇到OOM问题,则在/home/admin/dump/中创建dump文件

方法2:通过jmap获取

Jmap是JDK中包含的JVM检测工具。为了通过jmap获得堆栈溢出的dump文件,对代码进行了以下更改:

@Override访问测试代码门户,在应用程序服务器上执行以下操作:

Jmap-dump : live,format=b,file=PID可以获取文件。

堆栈溢出测试

管理员用户登录到服务器,找到Tomcat进程ID。运行/jstat -gcutil {pid} {间隔}观察GC运行。

可以看出,目前YGC和FGC都不频繁,而且都处于正常状态。

访问测试路径3358 {IP} :port/pa时

运行结束后,Eden区和old区瞬间爆满,短时间内发生了多次FGC:

MAT内存分析

Mat是快速分析Java内存、mat主页的工具。

在服务器上,可以在先前指定的路径下找到在1: /home/admin/dump/中生成的hprof文件。方法2:生成的文件,下载后用mat内存分析软件打开

Mat分析后,“Hea”代码入口引起的堆栈溢出,最后我们的“原犯”投入睡眠,是因为代码出现了死循环,不断创建新的class类,导致堆栈溢出。

摘要

发生Jvm问题时,不要惊慌。不要因为基于技术的问题而感到无法开始。有很多方法可以很容易地找到原因。除了本文提到的mat内存分析工具外,还有很多其他小工具。JDK本身提供了许多此类支持工具(例如,jconsole、jmap)

关于作者: luda

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐