第二章 java內(nèi)存區(qū)域與內(nèi)存溢出異常

運(yùn)行時(shí)數(shù)據(jù)區(qū)域

名稱 定義 是否線程共享 備注
程序計(jì)數(shù)器(program counter register) 當(dāng)前線程執(zhí)行的字節(jié)碼行號(hào)指示器
java 虛擬機(jī)棧(java virtual machine stacks) java方法執(zhí)行的內(nèi)存模型,局部變量表
本地方法棧(native method stacks) 針對(duì)native方法的棧
java堆(java heap) 所有對(duì)象實(shí)例和數(shù)組在堆上分配 物理上可以不連續(xù)
方法區(qū)(method area) 存儲(chǔ)已被虛擬機(jī)加載的類信息抖苦、常量、靜態(tài)變量、即時(shí)編譯器編譯的代碼數(shù)據(jù)
運(yùn)行時(shí)常量池(runtime constant pool) 方法區(qū)的一部分砖茸,用于存放編譯期生成的各種字面量和符號(hào)引用,是在類加載后存放到該區(qū)域
直接內(nèi)存(direct memory) 不是運(yùn)行時(shí)數(shù)據(jù)一部分殴穴,通過(guò)java堆里面的DirectByteBuffer對(duì)象作為這塊內(nèi)存的引用操作 無(wú)

實(shí)戰(zhàn) OutOfMemoryError異常

  • java堆溢出
/**
 * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
 * @author zzm
 */
public class HeapOOM {

    static class OOMObject {
    }

    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<OOMObject>();

        while (true) {
            list.add(new OOMObject());
        }
    }
}

  • 虛擬機(jī)棧和本地方法棧溢出
/**
 * VM Args:-Xss128k
 * @author zzm
 */
public class JavaVMStackSOF {

    private int stackLength = 1;

    public void stackLeak() {
        stackLength++;
        stackLeak();
    }

    public static void main(String[] args) throws Throwable {
        JavaVMStackSOF oom = new JavaVMStackSOF();
        try {
            oom.stackLeak();
        } catch (Throwable e) {
            System.out.println("stack length:" + oom.stackLength);
            throw e;
        }
    }
}
  • 運(yùn)行時(shí)常量池溢出
/**
 * VM Args:-XX:PermSize=10M -XX:MaxPermSize=10M
 * @author zzm
 */
public class RuntimeConstantPoolOOM {

    public static void main(String[] args) {
        // 使用List保持著常量池引用凉夯,避免Full GC回收常量池行為
        List<String> list = new ArrayList<String>();
        // 10MB的PermSize在integer范圍內(nèi)足夠產(chǎn)生OOM了
        int i = 0; 
        while (true) {
            list.add(String.valueOf(i++).intern());
        }
    }
}


  • 方法區(qū)溢出
/**
 * VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M
 * @author zzm
 */
public class JavaMethodAreaOOM {

    public static void main(String[] args) {
        while (true) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(OOMObject.class);
            enhancer.setUseCache(false);
            enhancer.setCallback(new MethodInterceptor() {
                public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                    return proxy.invokeSuper(obj, args);
                }
            });
            enhancer.create();
        }
    }

    static class OOMObject {

    }
}


  • 本機(jī)直接內(nèi)存溢出
/**
 * VM Args:-Xmx20M -XX:MaxDirectMemorySize=10M
 * @author zzm
 */
public class DirectMemoryOOM {

    private static final int _1MB = 1024 * 1024;

    public static void main(String[] args) throws Exception {
        Field unsafeField = Unsafe.class.getDeclaredFields()[0];
        unsafeField.setAccessible(true);
        Unsafe unsafe = (Unsafe) unsafeField.get(null);
        while (true) {
            unsafe.allocateMemory(_1MB);
        }
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市采幌,隨后出現(xiàn)的幾起案子劲够,更是在濱河造成了極大的恐慌,老刑警劉巖植榕,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件再沧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尊残,警方通過(guò)查閱死者的電腦和手機(jī)炒瘸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寝衫,“玉大人顷扩,你說(shuō)我怎么就攤上這事∥恳悖” “怎么了隘截?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)汹胃。 經(jīng)常有香客問(wèn)我婶芭,道長(zhǎng),這世上最難降的妖魔是什么着饥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任犀农,我火速辦了婚禮,結(jié)果婚禮上宰掉,老公的妹妹穿的比我還像新娘呵哨。我一直安慰自己,他們只是感情好轨奄,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布孟害。 她就那樣靜靜地躺著,像睡著了一般挪拟。 火紅的嫁衣襯著肌膚如雪挨务。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音耘子,去河邊找鬼果漾。 笑死球切,一個(gè)胖子當(dāng)著我的面吹牛谷誓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吨凑,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捍歪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鸵钝?” 一聲冷哼從身側(cè)響起糙臼,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恩商,沒(méi)想到半個(gè)月后变逃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怠堪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年揽乱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粟矿。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凰棉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陌粹,到底是詐尸還是另有隱情撒犀,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布掏秩,位于F島的核電站或舞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蒙幻。R本人自食惡果不足惜映凳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杆煞。 院中可真熱鬧魏宽,春花似錦、人聲如沸决乎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)构诚。三九已至蚌斩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間范嘱,已是汗流浹背送膳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工员魏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叠聋。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓撕阎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碌补。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虏束,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容