今天遇到一个又去的问题,在死循环中new对象,会造成 OOM 吗?
把这问题发到技术群中,有说会,有说不会的,引起一片热论。
我们还是来个demo模拟一下,看看什么结果吧
代码如下:
public static void main(String[] args) { while (true) { try { log.info("new"); //模拟new对象,加入10000条数据 Map<String,Integer> 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 文件,双击打开即可。
打开之后,界面如下:
然后运行我们的demo之后这边的列表就会出现个代码执行的package,双击 ==> 监控 ==> 即可查看我们代码执行后JVM中堆空间的内存变化。
等执行一段时间之后,根据上图可以发现堆空间中的内存到了一定值之后就会被GC回收,由此得到结论:
死循环中new对象,不会OOM,原因是每一轮循环之后对象就失去了引用,等到GC执行,对象就会被回收;
但是,如果我们的对象内存很大(例如:刚才的Map中put很多很多值进去),已经超过JVM的堆空间,就会OOM。