美團面試真題之一個線程OOM,進程里的其他線程還能運行嗎午磁?

一個進程有3個線程尝抖,如果一個線程拋出OOM,其他兩個線程還能運行嗎漓踢?

答案是還能運行

不瞞大家說牵署,正在面試中,我遇到這一題喧半,我估計也會答錯奴迅,因為我初看這一題的時候,覺得是在考察JVM的內存結構挺据,我第一反應是OOM常見情況堆內存溢出取具,也就是下面的這種異常

java.lang.OutOfMemoryError:java heap space

多線程中棧與堆是公有還是私有的

在多線程環(huán)境下,每個線程擁有一個棧和一個程序計數器扁耐,棧和程序計數器用來保存線程執(zhí)行歷史和線程執(zhí)行狀態(tài)暇检,是線程私有的,堆是由用一個進程內多個線程共享的婉称。

測試代碼偽代碼如下:

一個線程去構造堆內存溢出块仆,每隔ls申請一次堆內存构蹬。

package com.ypb.oom;

import com.google.common.collect.Lists;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;

/**
 * @className ThreadOOMTest
 * @description 測試一個線程出現OOM,同進程下的其他線程還能繼續(xù)運行嗎悔据?
 * @author yangpengbing
 * @date 22:12 2018/12/19
 * @version 1.0.0
 */
@Slf4j
public class ThreadOOMTest {

    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        int m = 1024 * 1024;
        String name = "oom-thread";

        new Thread(() -> {
            List<byte[]> bytes = Lists.newArrayList();
            while (true) {
                show(format(formatter));
                
                bytes.add(new byte[m]);
                
                sleep();
            }
        }, name).start();

        name = "not-oom-thread";
        new Thread(()->{
            while (true) {
                show(format(formatter));
                sleep();
            }
        }, name).start();
    }

    /**
     * 控制臺輸出時間和線程名稱
     * @param msg
     */
    private static void show(String msg) {
        System.out.println(msg);
    }

    /**
     * 線程休眠1s
     */
    private static void sleep() {
        try {
            TimeUnit.SECONDS.sleep(1L);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 格式化輸出的信息
     * @param formatter
     * @return
     */
    private static String format(DateTimeFormatter formatter) {
        return String.format("data {%s}, thread {%s}", LocalDateTime.now().format(formatter), Thread.currentThread().getName());
    }
}

控制臺輸出的結果:

從日志中可以看出庄敛,線程oom-thread線程溢出了,其他線程not-oom-thread線程還在執(zhí)行中科汗。使用jvisualvm監(jiān)控下藻烤。

設置的jvm參數:

-Xmx32m -Xms32m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCDateStamps -Xloggc:E:/gc.log

1

分析gc日志,可以看出老年代的內存使用率達到99.79%头滔。內存使用率已經滿了怖亭。出現內存溢出。

上面是jvisualvm監(jiān)控堆內存變化的結果坤检,注意看圖上兴猩,拋出OOM的時間在14:56:54左右,重點關注這個時間點左右的曲線變化缀蹄。發(fā)現堆使用的數量突然間急速下滑峭跳,這代表這一點,當一個線程拋出OOM異常后缺前,它說占用的內存空間會全部被釋放掉蛀醉,從而不會影響其他線程的運行。

這個例子只是演示了堆內存溢出的情況衅码,如果是棧內存溢出拯刁,結論也是一樣的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末逝段,一起剝皮案震驚了整個濱河市垛玻,隨后出現的幾起案子,更是在濱河造成了極大的恐慌奶躯,老刑警劉巖帚桩,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異嘹黔,居然都是意外死亡账嚎,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門儡蔓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郭蕉,“玉大人,你說我怎么就攤上這事喂江≌傩猓” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵获询,是天一觀的道長涨岁。 經常有香客問我拐袜,道長,這世上最難降的妖魔是什么梢薪? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任阻肿,我火速辦了婚禮,結果婚禮上沮尿,老公的妹妹穿的比我還像新娘。我一直安慰自己较解,他們只是感情好畜疾,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著印衔,像睡著了一般啡捶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奸焙,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天瞎暑,我揣著相機與錄音,去河邊找鬼与帆。 笑死了赌,一個胖子當著我的面吹牛,可吹牛的內容都是我干的玄糟。 我是一名探鬼主播勿她,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阵翎!你這毒婦竟也來了逢并?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤郭卫,失蹤者是張志新(化名)和其女友劉穎砍聊,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體贰军,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡玻蝌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了谓形。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灶伊。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寒跳,靈堂內的尸體忽然破棺而出聘萨,到底是詐尸還是另有隱情,我是刑警寧澤童太,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布米辐,位于F島的核電站胸完,受9級特大地震影響,放射性物質發(fā)生泄漏翘贮。R本人自食惡果不足惜赊窥,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狸页。 院中可真熱鬧锨能,春花似錦、人聲如沸芍耘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斋竞。三九已至倔约,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坝初,已是汗流浹背浸剩。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鳄袍,地道東北人绢要。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像畦木,于是被迫代替她去往敵國和親袖扛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容