日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 架構(gòu)師社區(qū)
[導(dǎo)讀]這里,我將在平時工作過程中總結(jié)的內(nèi)存溢出的情況,以代碼案例的形式直觀的分享給大家,希望能夠為小伙伴們帶來實質(zhì)性的幫助。


案例介紹

這里,我將在平時工作過程中總結(jié)的內(nèi)存溢出的情況,以代碼案例的形式直觀的分享給大家,希望能夠為小伙伴們帶來實質(zhì)性的幫助。

接下來,我們就以代碼案例的形式來分析各種內(nèi)存溢出的情況。

定義主類結(jié)構(gòu)

首先,我們創(chuàng)建一個類叫做BlowUpJVM,所有的案例實驗都是基于這個類進(jìn)行。

public?class?BlowUpJVM?{??
}?

棧深度溢出

public?static?void??testStackOverFlow(){?
??????BlowUpJVM.testStackOverFlow();?
}?

棧不斷遞歸,而且沒有處理,所以虛擬機(jī)棧就不斷深入不斷深入,棧深度就這樣溢出了。

永久代內(nèi)存溢出

public?static?void?testPergemOutOfMemory1(){?
???//方法一失敗?
????List?list?=?new?ArrayList();?
?
???while(true){?
??????list.add(UUID.randomUUID().toString().intern());?
???}?
}?

打算把String常量池堆滿,沒想到失敗了,JDK1.7后常量池放到了堆里,也能進(jìn)行垃圾回收了。

然后換種方式,使用cglib,用Class把老年代取堆滿

public?static?void?testPergemOutOfMemory2(){?
???try?{?
??????while?(true)?{?
?????????Enhancer?enhancer?=?new?Enhancer();?
?????????enhancer.setSuperclass(OOM.class);?
?????????enhancer.setUseCache(false);?
?????????enhancer.setCallback(new?MethodInterceptor()?{?
????????????@Override?
????????????public?Object?intercept(Object?obj,?Method?method,?Object[]?args,?MethodProxy?proxy)?throws?Throwable?{?
???????????????return?proxy.invokeSuper(obj,?args);?
????????????}?
?????????});?
?????????enhancer.create();?
??????}?
???}?
???catch?(Exception?e){?
??????e.printStackTrace();?
???}?
}?

虛擬機(jī)成功內(nèi)存溢出了,那JDK動態(tài)代理產(chǎn)生的類能不能溢出呢?

public?static?void?testPergemOutOfMemory3(){?
???while(true){?
???final?OOM?oom?=?new?OOM();?
???Proxy.newProxyInstance(oom.getClass().getClassLoader(),?oom.getClass().getInterfaces(),?new?InvocationHandler()?{?
?????????public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)?throws?Throwable?{?
????????????Object?result?=?method.invoke(oom,?args);?
????????????return?result;?
?????????}?
??????});?
???}?
}?

事實表明,JDK動態(tài)代理差生的類不會造成內(nèi)存溢出,原因是:JDK動態(tài)代理產(chǎn)生的類信息,不會放到永久代中,而是放在堆中。

本地方法棧溢出

public?static?void?testNativeMethodOutOfMemory(){?
???int?j?=?0;?
???while(true){?
??????Printer.println(j++);?
??????ExecutorService?executors?=?Executors.newFixedThreadPool(50);?
??????int?i=0;?
??????while(i++<10){?
?????????executors.submit(new?Runnable()?{?
????????????public?void?run()?{?
????????????}?
?????????});?
??????}?
???}?
}?

這個的原理就是不斷創(chuàng)建線程池,而每個線程池都創(chuàng)建10個線程,這些線程池都是在本地方法區(qū)的,久而久之,本地方法區(qū)就溢出了。

JVM棧內(nèi)存溢出

public?static?void?testStackOutOfMemory(){?
????while?(true)?{???
????????????Thread?thread?=?new?Thread(new?Runnable()?{???
???????????????????public?void?run()?{?
??????????????????????????while(true){?
??????????????????????}?
???????????????????}???
????????????});???
????????????thread.start();???
?????}???
}?

線程的創(chuàng)建會直接在JVM棧中創(chuàng)建,但是本例子中,沒看到內(nèi)存溢出,主機(jī)先掛了,不是JVM掛了,真的是主機(jī)掛了,無論在mac還是在windows,都掛了。

溫馨提示,這個真的會死機(jī)的。

堆溢出

public?static?void?testOutOfHeapMemory(){?
???List?list?=?new?ArrayList();?
???while(true){?
??????StringBuffer?B?=?new?StringBuffer();?
??????for(int?i?=?0?;?i?10000?;?i++){?
?????????B.append(i);?
??????}?
??????list.add(B);?
???}?
}?

不斷往堆中塞新增的StringBuffer對象,堆滿了就直接溢出了。

特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:

【性能優(yōu)化】納尼?內(nèi)存又溢出了?是時候總結(jié)一波了!

【性能優(yōu)化】納尼?內(nèi)存又溢出了?是時候總結(jié)一波了!

【性能優(yōu)化】納尼?內(nèi)存又溢出了?是時候總結(jié)一波了!

長按訂閱更多精彩▼

【性能優(yōu)化】納尼?內(nèi)存又溢出了?是時候總結(jié)一波了!

如有收獲,點(diǎn)個在看,誠摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉