Jvm OOM性能问题分析实践

本文介绍了四种常见的Java OOM问题分析,包括堆溢出、线程栈溢出、方法区溢出和常量池溢出,提供了详细的分析步骤和示例代码,旨在提供一套通用的性能问题排查思路。
摘要由CSDN通过智能技术生成

   遇到性能问题大家都很头疼,那么遇到性能问题,如何进行分析,有没有一个通用的分析思路呢,接下来,根据个人工作中的经验,做了三种常见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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值