<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官欺負(fù)人:一個(gè)線程 OOM 后,其他線程還能運(yùn)行嗎?

          共 4997字,需瀏覽 10分鐘

           ·

          2021-05-14 06:40


          上一篇:3600萬(wàn)中國(guó)人在抖音“上清華”

          最近網(wǎng)上出現(xiàn)一個(gè)美團(tuán)面試題:“一個(gè)線程OOM后,其他線程還能運(yùn)行嗎?”。

          我看網(wǎng)上出現(xiàn)了很多不靠譜的答案。這道題其實(shí)很有難度,涉及的知識(shí)點(diǎn)有jvm內(nèi)存分配、作用域、gc等,不是簡(jiǎn)單的是與否的問題。

          由于題目中給出的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”)等很多種情況。

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

          先說一下答案,答案是還能運(yùn)行。

          代碼如下:

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

          上圖是JVM堆空間的變化。我們仔細(xì)觀察一下在14:42:05~14:42:25之間曲線變化,你會(huì)發(fā)現(xiàn)使用堆的數(shù)量,突然間急劇下滑!

          這代表這一點(diǎn),當(dāng)一個(gè)線程拋出OOM異常后,它所占據(jù)的內(nèi)存資源會(huì)全部被釋放掉,從而不會(huì)影響其他線程的運(yùn)行!

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

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

          最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):面試,可以獲取我整理的 Java、JVM 系列面試題和答案,非常齊全。

          原文鏈接:https://blog.csdn.net/gosaint/article/details/83823764


          看完這篇文章,你有什么收獲?歡迎在留言區(qū)與10w+Java開發(fā)者一起討論~

          關(guān)注微信公眾號(hào):互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的教程,都是干貨。


          猜你喜歡

          1、GitHub 標(biāo)星 3.2w!史上最全技術(shù)人員面試手冊(cè)!FackBoo發(fā)起和總結(jié)

          2、如何才能成為優(yōu)秀的架構(gòu)師?

          3、從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4、程序員一般可以從什么平臺(tái)接私活?

          5、37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...

          6、滴滴業(yè)務(wù)中臺(tái)構(gòu)建實(shí)踐,首次曝光

          7、不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

          8、15張圖看懂瞎忙和高效的區(qū)別

          9、2T架構(gòu)師學(xué)習(xí)資料干貨分享


          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线观看豆花 | 视色影院 | 18XXX亚洲HD护士JD | 91aiai | 一区二区三区毛片 |