亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JVM堆內存溢出后,其他線程是否可繼續(xù)工作的問題解析

 更新時間:2019年08月20日 08:31:47   作者:程序員喬戈里  
這篇文章主要介紹了JVM 堆內存溢出后,其他線程是否可繼續(xù)工作?,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

最近網上出現一個美團面試題:“一個線程OOM后,其他線程還能運行嗎?”。我看網上出現了很多不靠譜的答案。這道題其實很有難度,涉及的知識點有jvm內存分配、作用域、gc等,不是簡單的是與否的問題。

由于題目中給出的OOM,java中OOM又分很多類型;比如:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)、永久帶溢出(“java.lang.OutOfMemoryError:Permgen space”)、不能創(chuàng)建線程(“java.lang.OutOfMemoryError:Unable to create new native thread”)等很多種情況。

本文主要是分析堆溢出對應用帶來的影響。

先說一下答案,答案是還能運行。

代碼如下

public class JvmThread {
  public static void main(String[] args) {
    new Thread(() -> {
      List<byte[]> list = new ArrayList<byte[]>();
      while (true) {
        System.out.println(new Date().toString() + Thread.currentThread() + "==");
        byte[] b = new byte[1024 * 1024 * 1];
        list.add(b);
        try {
          Thread.sleep(1000);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }).start();
    // 線程二
    new Thread(() -> {
      while (true) {
        System.out.println(new Date().toString() + Thread.currentThread() + "==");
        try {
          Thread.sleep(1000);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }).start();
  }
}

結果展示:

Wed Nov 07 14:42:18 CST 2018Thread[Thread-1,5,main]==
Wed Nov 07 14:42:18 CST 2018Thread[Thread-0,5,main]==
Wed Nov 07 14:42:19 CST 2018Thread[Thread-1,5,main]==
Wed Nov 07 14:42:19 CST 2018Thread[Thread-0,5,main]==
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
  at com.gosaint.util.JvmThread.lambda$main$0(JvmThread.java:21)
  at com.gosaint.util.JvmThread$$Lambda$1/521645586.run(Unknown Source)
  at java.lang.Thread.run(Thread.java:748)
Wed Nov 07 14:42:20 CST 2018Thread[Thread-1,5,main]==
Wed Nov 07 14:42:21 CST 2018Thread[Thread-1,5,main]==
Wed Nov 07 14:42:22 CST 2018Thread[Thread-1,5,main]==

JVM啟動參數設置:

上圖是JVM堆空間的變化。我們仔細觀察一下在14:42:05~14:42:25之間曲線變化,你會發(fā)現使用堆的數量,突然間急劇下滑!這代表這一點,當一個線程拋出OOM異常后,它所占據的內存資源會全部被釋放掉,從而不會影響其他線程的運行!

講到這里大家應該懂了,此題的答案為一個線程溢出后,進程里的其他線程還能照常運行。注意了,這個例子我只演示了堆溢出的情況。如果是棧溢出,結論也是一樣的,大家可自行通過代碼測試。

總結:其實發(fā)生OOM的線程一般情況下會死亡,也就是會被終結掉,該線程持有的對象占用的heap都會被gc了,釋放內存。因為發(fā)生OOM之前要進行gc,就算其他線程能夠正常工作,也會因為頻繁gc產生較大的影響。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java實現電話本系統

    java實現電話本系統

    這篇文章主要為大家詳細介紹了java實現電話本系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java在PowerPoint中添加上標和下標的實現方法

    Java在PowerPoint中添加上標和下標的實現方法

    當我們在演示文稿中添加商標、版權或其他符號時,我們可能希望該符號出現在某個文本的上方或下方。在Microsoft PowerPoint中,我們可以通過對符號應用上標或下標格式來實現這種效果,這篇文章主要介紹了Java在PowerPoint中添加上標和下標,需要的朋友可以參考下
    2022-10-10
  • Springboot如何同時裝配兩個相同類型數據庫

    Springboot如何同時裝配兩個相同類型數據庫

    這篇文章主要介紹了Springboot如何同時裝配兩個相同類型數據庫,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Boot實現文件上傳示例代碼

    Spring Boot實現文件上傳示例代碼

    本篇文章主要介紹了Spring Boot實現文件上傳示例代碼,可以實現單文件和多文件的上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Spring Security賬戶與密碼驗證實現過程

    Spring Security賬戶與密碼驗證實現過程

    這篇文章主要介紹了Spring Security賬戶與密碼驗證實現過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-03-03
  • Java?DelayQueue實現任務延時示例講解

    Java?DelayQueue實現任務延時示例講解

    DelayQueue是一個無界的BlockingQueue的實現類,用于放置實現了Delayed接口的對象,其中的對象只能在其到期時才能從隊列中取走。本文就來利用DelayQueue實現延時任務,感興趣的可以了解一下
    2022-09-09
  • Java處理圖片實現base64編碼轉換

    Java處理圖片實現base64編碼轉換

    這篇文章主要介紹了Java處理圖片實現base64編碼轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • SpringMVC加載控制與Postmand的使用和Rest風格的引入及RestFul開發(fā)全面詳解

    SpringMVC加載控制與Postmand的使用和Rest風格的引入及RestFul開發(fā)全面詳解

    SpringMVC是一種基于Java,實現了Web MVC設計模式,請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將Web層進行職責解耦。基于請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發(fā),SpringMVC也是要簡化我們日常Web開發(fā)
    2022-10-10
  • java實現計算器功能

    java實現計算器功能

    這篇文章主要為大家詳細介紹了java實現計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • java中jar包的生成與使用方式

    java中jar包的生成與使用方式

    這篇文章主要介紹了java中jar包的生成與使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論