• JVM优化之实战:内存溢出的定位与分析


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

    如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并且进行分析,是正常还是非正常情况

    如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需求,那么就要对代码进行修改,修复这个bug

    首先,我们得先学会如何定位问题,然后再进行分析。如何定位问题呢,我们需要借助于jmap与MAT工具进行定位分析

    接下来,我们模拟内存溢出的场景。

    模拟内存溢出

    编写代码,向List集合中添加100万个字符串,每个字符串由1000个UUID组成。如果程序能够正常执行,最后打印ok。

    package com.wish;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    public class TestJvmOutOfMemory {
        public static void main(String[] args) {
            List<Object> list = new ArrayList<>();
            for (int i = 0; i < 10000000; i++) {
                String str = "";
                for (int j = 0; j < 1000; j++) {
                    str += UUID.randomUUID().toString();
                }
                list.add(str);
            }
            System.out.println("ok");
        }
    }
    

      

    设置执行的参数,这里使用的是Idea编辑器。

    参数如下:

    ‐Xms8m ‐Xmx8m ‐XX:+HeapDumpOnOutOfMemoryError
    

      

    运行程序

     可以看到,当发生内存溢出时,会dump文件到java_pid5348.hprof。

     

    导入到MAT工具中进行分析

     可以看到,有92.59%的内存由Object[]数组占有,所以比较可疑。

    分析:这个可疑是正确的,因为已经有超过90%的内存都被它占有,这是非常有可能出现内存溢出的。

    查看详情:点击Details

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

  • 相关阅读:
    python 下载文件保存到本地
    python 模拟udp客户端发送报文
    Block的底层代码实现
    常见的崩溃问题和类型
    NSTimer打破循环引用的几种方式
    springcloud alibaba Nacos解决OpenFeign调用失败问题
    LRU算法
    常见算法题解
    PHP无文件木马
    c++各种类型的字节数
  • 原文地址:https://www.cnblogs.com/wishsaber/p/12409226.html
Copyright © 2020-2023  润新知