我们开发一个测试程序来模拟outofmemory怎么解决情况。
程序很简单代码如下:
我们进入该java文件所在的目录,然后打开控制窗口进入到该目录。
再来看我们的test目录
这下子生成叻编译之后的.class文件然后我们来执行它。
如果直接执行这个程序的话它会直到耗至我们机器上所有的内存才会报错,方便我们进行演示运行的时候加上-Xmx10m。
运行之后等待一会如果不想等待这么久的话,还可以将运行内存调整至5M
产生内存溢出的问题现在我们该如何分析呢?
一个Heap Dump是指在某个时刻对一个java进程所使用的内存情况的一次快照也就是在某个时刻把Java进程的内存以某种格式持久化到了磁盘上。
此参數是帮助生成dump文件程序启动后直到抛出OOM异常。异常抛出后在程序的classpath下生成以一个.hprof结尾的文件,如:java_pid4504.hprof这就是我们需要的dump文件。
我们先看一下该目录是没有.hprof文件的
加上这个参数我们在运行一次
再来看一下test目录
这是我们可以看到一件生成了.hprof文件,在实际生产环境中这个文件会非常大
IBM开发的强大的内存dump分析工具,IBM heapAnalyzer是通过分析OOM后的Java heap dump文件的通过对dump文件的分析找到可能!!!泄露的点。(注意:这是说的是可能真正的内存溢出,我们还需要结合程序来进行一个分析)
下载之后只有得到这样的文件(下载方式在底部)
运行之后打开一个这个界媔
选中然后点击open
这里说明,有一个对象占用了百分之九十四的空间可能是它造成的溢出,但是这里说的是可能!具体还要结合具体的程序去分析到底在那个地方造成的泄露。
实际生产环境中的文件非常大也不会像这里这么明显,所以还需要在实际生产环境中多多实踐!
这套方法还可以在一下程序中使用:
因为他们的底层都是用的jvm总结一句话,只要底层用jvm都可以用这套方法。
下载之后是一个jar文件需要在命令窗口运行这个jar文件。