死循环while/for中new对象? 不怕 OOM 吗?

一、前言

今天遇到一个又去的问题,在死循环中new对象,会造成 OOM 吗

把这问题发到技术群中,有说会,有说不会的,引起一片热论。

我们还是来个demo模拟一下,看看什么结果吧

 

二、模拟在死循环中new对象

代码如下:

    public static void main(String[] args) { 
        while (true) {
            try {
                log.info("new");
                //模拟new对象,加入10000条数据
                Map map =new HashMap<>();
                for (int i = 0; i< 10000; i++){
                    map.put(""+i,i);
                }
            } catch (Exception e) {
                log.error("exception!", e);
            } finally {
                try {
                    //等待2秒
                    TimeUnit.SECONDS.sleep(2);
                } catch (Exception e) {
                    log.error("sleep exception!", e);
                }
            }
        }
    }

 然后配合JDK的  Java VisuaLVM  工具检查堆空间的内存,找到 jdk的bin目录下 jvisualvm.exe 文件,双击打开即可。

死循环while/for中new对象? 不怕 OOM 吗?_第1张图片

打开之后,界面如下:

死循环while/for中new对象? 不怕 OOM 吗?_第2张图片

 然后运行我们的demo之后这边的列表就会出现个代码执行的package,双击 ==> 监控 ==> 即可查看我们代码执行后JVM中堆空间的内存变化。

死循环while/for中new对象? 不怕 OOM 吗?_第3张图片

 三、结论

 死循环while/for中new对象? 不怕 OOM 吗?_第4张图片

 等执行一段时间之后,根据上图可以发现堆空间中的内存到了一定值之后就会被GC回收,由此得到结论:

死循环中new对象,不会OOM,原因是每一轮循环之后对象就失去了引用,等到GC执行,对象就会被回收;

但是,如果我们的对象内存很大(例如:刚才的Map中put很多很多值进去),已经超过JVM的堆空间,就会OOM。

你可能感兴趣的:(JVM,java技术)