今天是周末受扳,祝大家周末愉快,11月3日更新了極限挑戰(zhàn)兔跌,看的我是感觸良多辞色,心中還是澎湃的不行「《ǎ看到時(shí)光的飛逝相满,讓人更加的感受到,這就是生活桦卒。所以也希望大家能夠通過總結(jié)之后珍惜良多的時(shí)光立美,我也盡量把知識(shí)點(diǎn)濃縮一下。
今天我們就聊聊Java中最經(jīng)常出現(xiàn)的OOM異撤皆郑——OutOfMemoryError建蹄。
OutOfMemoryError異常情況
除了程序計(jì)數(shù)器外,虛擬機(jī)內(nèi)存的其他幾個(gè)運(yùn)行時(shí)區(qū)域都有發(fā)生OutOfMemoryError(OOM)異常的可能裕偿。
Java堆溢出
Java堆用于存儲(chǔ)對(duì)象實(shí)例洞慎,只要不斷地創(chuàng)建對(duì)象,并且保證GC Roots到對(duì)象之間有可達(dá)路徑來避免垃圾回收機(jī)制清除這些對(duì)象嘿棘,那么在對(duì)象數(shù)量到達(dá)最大堆的容量限制后悔產(chǎn)生內(nèi)存溢出異常劲腿。
堆最小值-Xms和堆最大值-Xmx設(shè)置一樣可以避免堆自動(dòng)擴(kuò)展。
虛擬機(jī)棧和本地方法棧溢出
-Xoss參數(shù)在Hotspot是無效的(設(shè)置本地方法棧大心衩睢)焦人,棧容量只由-Xss參數(shù)設(shè)定。
如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的最大深度重父,將拋出StackOverFlowError異常花椭。
如果虛擬機(jī)在擴(kuò)展棧時(shí)無法申請(qǐng)到足夠的內(nèi)存空間,則拋出OutOfMemoryError異常房午。
在單線程下矿辽,無論是由棧幀太大還是虛擬機(jī)棧容量太小,當(dāng)內(nèi)存無法分配的時(shí)候郭厌,虛擬機(jī)拋出的都是StackOverFlowError異常袋倔。
棧深度在大多數(shù)情況下達(dá)到1000-2000完全沒有問題。但是如果建立過多的線程導(dǎo)致的內(nèi)存溢出沪曙,在不能減少線程數(shù)或者更換64位虛擬機(jī)的情況下奕污,就只能減少最大堆和減少棧容量來換取更多的線程。
方法區(qū)和運(yùn)行時(shí)常量池溢出
-XX:PermSize和-XX:MaxPermSize限制方法區(qū)大小液走,從而間接限制其中常量池的容量碳默。
本機(jī)直接內(nèi)存溢出
直接內(nèi)存容量可以通過-XX:MaxDirectMemorySize制定贾陷,如果不指定,則默認(rèn)與Java堆最大值(-Xmx)一樣嘱根。
直接內(nèi)存導(dǎo)致的的內(nèi)存溢出的一個(gè)明顯的特征是HeapDump文件中不會(huì)看到明顯的異常髓废。
今天的篇幅比較精簡。我們其實(shí)只要記住這些该抒。在生活中排查問題的時(shí)候會(huì)有很多的幫助慌洪。也可以節(jié)約一些時(shí)間。用于更璀璨的生活中凑保。
我的文章每天都會(huì)在頭條號(hào)首發(fā)冈爹,然后第二天轉(zhuǎn)發(fā)到簡書中,希望有興趣的朋友可以關(guān)注我的頭條號(hào):[Bug制造機(jī)]
(https://www.toutiao.com/c/user/51553105950/#mid=1582105392193550)欧引。謝謝大家的支持频伤。