请关注更深的句子,云计算频道。
什么是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)