欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

最近網(wǎng)上出現(xiàn)一個美團(tuán)面試題:“一個線程OOM后,其他線程還能運行嗎?”。我看網(wǎng)上出現(xiàn)了很多不靠譜的答案。這道題其實很有難度,涉及的知識點有jvm內(nèi)存分配、作用域、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”)等很多種情況。

本文主要是分析堆溢出對應(yīng)用帶來的影響。

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

代碼如下

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();
  }
}

結(jié)果展示:

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啟動參數(shù)設(shè)置:

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實現(xiàn)電話本系統(tǒng)

    java實現(xiàn)電話本系統(tǒng)

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

    Java在PowerPoint中添加上標(biāo)和下標(biāo)的實現(xiàn)方法

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

    Springboot如何同時裝配兩個相同類型數(shù)據(jù)庫

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

    Spring Boot實現(xiàn)文件上傳示例代碼

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

    Spring Security賬戶與密碼驗證實現(xiàn)過程

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

    Java?DelayQueue實現(xiàn)任務(wù)延時示例講解

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

    Java處理圖片實現(xiàn)base64編碼轉(zhuǎn)換

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

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

    SpringMVC是一種基于Java,實現(xiàn)了Web MVC設(shè)計模式,請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡埱篁?qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),SpringMVC也是要簡化我們?nèi)粘eb開發(fā)
    2022-10-10
  • java實現(xiàn)計算器功能

    java實現(xiàn)計算器功能

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

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

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

最新評論