死循環while/for中new對象? 不怕 OOM 嗎?

一、前言

今天遇到一個又去的問題,在死循環中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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章