zoukankan      html  css  js  c++  java
  • JVM内存溢出

    简介:

        内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文件等等,都可能会造成内存溢出。如果出现了内存溢出,首先我们需要定位发生内存溢出的环节,并且进行分析,是正常还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需求,那么就要对代码进行修改,修复这个bug。首先,我们得先学会如定位问题,然后再进行分析。如何定位问题呢,我们需要借助于jmap与MAT工具进行定位分析。接下来,我们模拟内存溢出的场景。

    实战模拟:

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

    public class HeapTest {
        public static void main(String[] args) {
            List<Object> objList=new ArrayList<>();
            for (int i=0;i<10000000;i++){
                String str="";
                for(int j=0;j<1000;j++){
                    str+= UUID.randomUUID().toString();
                }
                objList.add(str);
            }
            System.out.println("添加数据成功~");
        }
    }

    设置执行的参数,这里使用的是Idea编辑器。加入以下参数:

                              -Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

     直接运行效果如下:

    打开项目所在的文件夹可以看到当发生内存溢出时,会dump文件到java_pid5348.hprof。

     导入到MAT工具中进行分析

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

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

    查看详情:点击Details

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

  • 相关阅读:
    【生活】我以为的周末 vs 实际上的周末
    【JS】553- 深入理解之undefined与null
    【React】552- React 中必会的 10 个概念
    【性能】551- 前端性能优化之重排和重绘
    【学习】复工至今,自我小结。你也是这样吗?
    【JS】550- 简单几步让你的 JS 写得更漂亮
    【数据结构】549- 8种常见数据结构(JS实现)
    ios 设计软件
    学习网站
    推送客户端学习网址
  • 原文地址:https://www.cnblogs.com/ws1149939228/p/12410129.html
Copyright © 2011-2022 走看看