一、前言
今天遇到一個又去的問題,在死循環中new對象,會造成 OOM 嗎?
把這問題發到技術羣中,有說會,有說不會的,引起一片熱論。
我們還是來個demo模擬一下,看看什麼結果吧
二、模擬在死循環中new對象
代碼如下:
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。