java内存溢出的定位和分析

内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文件等,都会造成内存溢出。

如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并进行分析,是正常情况还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果不是正常的需求,那么就要对代码进行修改,修复这个bug。

1.模拟内存溢出

public class TestJVMOutOfMemory {
    public static void main(String[] args) {
        List<Object> list = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            StringBuilder str = new StringBuilder();
            for (int j = 0; j < 1000; j++) {
                str.append(UUID.randomUUID().toString());
            }
            list.add(str.toString());
        }
        System.out.println("ok");
    }
}

设置启动参数以更快的出现问题

-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

测试结果如下:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid1102.hprof ...
Heap dump file created [7959370 bytes in 0.063 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:3664)
    at java.lang.String.<init>(String.java:207)
    at java.lang.StringBuilder.toString(StringBuilder.java:407)
    at com.yfy.demo01.TestJVMOutOfMemory.main(TestJVMOutOfMemory.java:21)

2.在MAT中进行分析

 

可以看到,有93.88的内存由Object[]数组占有。这个地方是有可能出现内存溢出的。

点击Details查看详情:

 

可以看到集合中存储了大量的uuid字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值