遇到性能问题大家都很头疼,那么遇到性能问题,如何进行分析,有没有一个通用的分析思路呢,接下来,根据个人工作中的经验,做了三种常见OOM示例,以期提供一套通用的分析思路作为参考,希望对大家有帮助。
当然,同行大牛发现文中见解有问题的话,也希望能够予以指正。
一.堆溢出
java堆是用来存放对象实例的,如果我们不断的创建对象,且保证GC Roots到对象之间可达,那么就可以避免垃圾回收机制清理这些创建的对象,因此,当对象数量到达堆的最大容量限制后就会产生内存溢出异常。下面我们来模拟这种异常。(1)配置jvm启动参数,run as –> run configration 里可以配置。
下面几个参数的意思是:-Xms5m -Xmx5m :堆的最大最小值都是5m,避免自动扩展。-XX:+HeapDumpOnOutOfMemoryError :让虚拟机在出现堆溢出时自动dump当前内存堆转储快照,以便进行分析。-XX:+PrintGCDetails -XX:+PrintGCTimeStamps 打印gc信息便于我们分析。
(2)准备示例代码:
public class MemoryleaksDemo {
public static void main(String[] args) throws InterruptedException {
MemoryleaksDemo mem =new MemoryleaksDemo();mem.BadExample();
}
public void BadExample() throws InterruptedException {
//内存泄露:o对象一直被v引用,gc无法清理掉,造成泄露
Vector v=new Vector(10);
while(true)
{
Object o=new Object();
v.add(o);
o=null;
}
}
}
(3)运行结果:java.lang.OutOfMemoryError: Java heap space,且自动生成了dump文件java_pid5043.hprof,在工程根目录下。
分析:
分析dump文件
(1)打开dump文件,看到Overview中total使用了3.4M,其中一块内存占用了3.1M,点击Leak Suspects
(2)可以看到第一个问题,存在一个超大的java.lang.Object[]对象,点击Details