JVM 常见异常及内存诊断
棧內(nèi)存溢出
棧內(nèi)存大小設(shè)置:-Xss size 默認(rèn)除了window以外的所有操作系統(tǒng)默認(rèn)情況大小為 1MB,window 的默認(rèn)大小依賴于虛擬機(jī)內(nèi)存。
棧幀過(guò)多導(dǎo)致棧內(nèi)存溢出
下述示例代碼,由于遞歸深度沒(méi)有限制且沒(méi)有設(shè)置出口,每次方法的調(diào)用都會(huì)產(chǎn)生一個(gè)棧幀導(dǎo)致了創(chuàng)建的棧幀過(guò)多,而導(dǎo)致內(nèi)存溢出(StackOverflowError)。
示例代碼:
運(yùn)行結(jié)果:
棧幀過(guò)大導(dǎo)致棧內(nèi)存溢出
示例代碼:
運(yùn)行結(jié)果:
如下所示部門依賴員工集合,員工依賴于部門,如此一來(lái),由于循環(huán)引用使得棧幀過(guò)大從而導(dǎo)致棧內(nèi)存的溢出。
因此我們的解決思路是:打破循環(huán)引用來(lái)解決,如下所示(當(dāng)然這只是針對(duì)當(dāng)前實(shí)例場(chǎng)景的解決方式,其主要目的是提供一種解決問(wèn)題的思路)
堆內(nèi)存溢出
堆內(nèi)存大小設(shè)置參數(shù):-Xmx
雖然“堆”是垃圾回收的主要管理區(qū)域,但垃圾回收主要是針對(duì)已經(jīng)無(wú)用的對(duì)象的,如果被引用的對(duì)象而且不斷的產(chǎn)生新對(duì)象而且一直被使用時(shí),垃圾回收器是不會(huì)處理被使用的對(duì)象的。如果不斷產(chǎn)生新對(duì)象最終超出了堆的內(nèi)存大小,則會(huì)導(dǎo)致堆內(nèi)存的溢出。
示例代碼:
默認(rèn)情況下下述代碼一般不會(huì)出現(xiàn)堆內(nèi)存溢出情況
把jvm的堆內(nèi)存上限大小設(shè)置成8MB,然后再運(yùn)行程序
運(yùn)行結(jié)果:
說(shuō)明:一般出現(xiàn)該情況我們是可以解決的,一方面是確實(shí)是因?yàn)閮?nèi)存不夠的,我們適當(dāng)?shù)恼{(diào)整內(nèi)存大小,另一方面就是程序邏輯本身有問(wèn)題,如下圖邏輯,這是一個(gè)死循環(huán),字符串通過(guò)不斷的添加,沒(méi)有終止的時(shí)候,不管設(shè)置多大的內(nèi)存都會(huì)最終撐爆最大的內(nèi)存限定,從而導(dǎo)致了內(nèi)存的溢出,以異常退出程序收?qǐng)觥?/p>
?
?
堆內(nèi)存診斷:
jps: 查看當(dāng)前系統(tǒng)中有那些java進(jìn)程
.....\demos\jvmbase>jps
28036
15180 Jps
6140 Demo1
jmap 工具: 查看堆內(nèi)存占用情況(瞬時(shí)的)
jmap? -heap 進(jìn)程id
下述是該命令呈現(xiàn)的部分內(nèi)容,下述是堆內(nèi)存某個(gè)瞬間的使用情況 如下:
?
jconsole 工具: 圖形界面的,內(nèi)存java性能分析器,多功能的監(jiān)測(cè)工具,可以連續(xù)監(jiān)測(cè)
方法區(qū)內(nèi)存溢出
代碼示例(基于jdk1.8):
上述代碼運(yùn)行,在沒(méi)有限定元空間大小的時(shí)候一般很難出現(xiàn)方法區(qū)內(nèi)存溢出。
下面通過(guò)限定元空間的大小為8M,然后重新運(yùn)行程序
通過(guò)限定元空間的大小,這時(shí)候會(huì)發(fā)現(xiàn)程序會(huì)拋出方法區(qū)的內(nèi)存溢出(也就是元空間導(dǎo)致的內(nèi)存溢出)
?
代碼示例(基于jdk1.6): 程序邏輯整體與上述jdk1.8一致,修改jdk版本為1.6:
默認(rèn)情況下不設(shè)置方法區(qū)的內(nèi)存大小一般也不會(huì)輕易出現(xiàn)問(wèn)題,下面我們同意通過(guò)修改內(nèi)存大小進(jìn)行試驗(yàn)
下面通過(guò)限定方法區(qū)(永久代)的大小為8M,然后重新運(yùn)行程序
通過(guò)限定方法區(qū)(永久代)的大小,這時(shí)候會(huì)發(fā)現(xiàn)程序會(huì)拋出方法區(qū)的內(nèi)存溢出(也就是永久代導(dǎo)致的內(nèi)存溢出)
?
總結(jié)
以上是生活随笔為你收集整理的JVM 常见异常及内存诊断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2022-2028年中国汽轮发电机行业市
- 下一篇: 2022-2028年中国汽车制动器行业投