JVM 自動(dòng)內(nèi)存管理機(jī)制——Java內(nèi)存區(qū)域與內(nèi)存溢出異常
(一)運(yùn)行時(shí)數(shù)據(jù)區(qū)
程序計(jì)數(shù)器:存放當(dāng)前線程所執(zhí)行的字節(jié)碼的指令地址(可以理解為執(zhí)行的行號(hào)指示器)航徙。
虛擬機(jī)棧:存放當(dāng)前線程(java方法)的局部變量表关霸、操作數(shù)棧、動(dòng)態(tài)鏈接葱跋、方法出口等信息(當(dāng)前線程創(chuàng)建 的一個(gè)棧幀)。
本地方法棧:存放本地方法的局部變量表、操作數(shù)棧橄碾、動(dòng)態(tài)鏈接卵沉、方法出口等信息。
堆:所有線程共享的一塊內(nèi)存區(qū)域法牲,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建史汗,用來(lái)存放幾乎所有的對(duì)象實(shí)例。
方法區(qū):所有線程共享拒垃,用戶存儲(chǔ)虛擬機(jī)家在的類(lèi)信息停撞、常量、靜態(tài)變量悼瓮、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)戈毒。
運(yùn)行時(shí)常量池:方法區(qū)的一部分,用戶存放編譯期生成的各種字面量和符號(hào)引用横堡。
(二)內(nèi)存溢出(OutOfMemoryError)
Java堆溢出:創(chuàng)建實(shí)例對(duì)象過(guò)多并且垃圾回收機(jī)制未及時(shí)清除對(duì)應(yīng)的對(duì)象埋市,導(dǎo)致內(nèi)存占用達(dá)到最大堆容量時(shí),再創(chuàng)建實(shí)例申請(qǐng)內(nèi)存就會(huì)出現(xiàn)堆溢出命贴。
虛擬機(jī)和本地方法棧溢出:線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的最大深度道宅,將拋出StackOverflowError異常;虛擬機(jī)在擴(kuò)展棧時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存空間胸蛛,則拋出OutOfMemoryError異常污茵。
方法區(qū)和運(yùn)行時(shí)常量池溢出:運(yùn)行時(shí)產(chǎn)生大量的類(lèi)去填滿方法區(qū),達(dá)到其最大的容量時(shí)會(huì)產(chǎn)生溢出
本機(jī)內(nèi)存直接溢出:機(jī)器上的內(nèi)存被使用完時(shí)產(chǎn)生溢出葬项。
小結(jié):透過(guò)了解虛擬機(jī)的內(nèi)存分配泞当,在實(shí)際操作過(guò)程中可以去排查對(duì)應(yīng)的內(nèi)存溢出問(wèn)題,本文主要介紹了產(chǎn)生內(nèi)存溢出的幾種可能性民珍,具體的問(wèn)題可以參考對(duì)照襟士,若有不對(duì)之處歡迎多多指教!