JVM:方法区可以GC吗?
方法區(qū)和堆一樣,都是線(xiàn)程共享的內(nèi)存區(qū)域,被用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息(字段等)、即時(shí)編譯后的代碼(方法字節(jié)碼)、靜態(tài)變量和常量等數(shù)據(jù)。
根據(jù)Java虛擬機(jī)規(guī)范的規(guī)定,方法區(qū)無(wú)法滿(mǎn)足內(nèi)存分配需求時(shí),也會(huì)拋出OutOfMemoryError異常,雖然規(guī)范規(guī)定虛擬機(jī)可以不實(shí)現(xiàn)垃圾收集,因?yàn)?span style="color:#f33b45;">和堆的垃圾回收效率相比,方法區(qū)的回收效率實(shí)在太低,但是此部分內(nèi)存區(qū)域也是可以被回收的。
方法區(qū)的垃圾回收主要有兩種,分別是對(duì)廢棄常量的回收(常量池的回收)和對(duì)無(wú)用類(lèi)的回收(類(lèi)的卸載)。
當(dāng)一個(gè)常量對(duì)象不再任何地方被引用的時(shí)候,則被標(biāo)記為廢棄常量,這個(gè)常量可以被回收。
方法區(qū)中的類(lèi)需要同時(shí)滿(mǎn)足以下三個(gè)條件才能被標(biāo)記為無(wú)用的類(lèi):
1.Java堆中不存在該類(lèi)的任何實(shí)例對(duì)象;
2.加載該類(lèi)的類(lèi)加載器已經(jīng)被回收;
3.該類(lèi)對(duì)應(yīng)的java.lang.Class對(duì)象不在任何地方被引用,且無(wú)法在任何地方通過(guò)反射訪(fǎng)問(wèn)該類(lèi)的方法。
當(dāng)滿(mǎn)足上述三個(gè)條件的類(lèi)才可以被回收,但是并不是一定會(huì)被回收,需要參數(shù)進(jìn)行控制,例如HotSpot虛擬機(jī)提供了-Xnoclassgc參數(shù)進(jìn)行控制是否回收。
總結(jié)
以上是生活随笔為你收集整理的JVM:方法区可以GC吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu系统批量端口永久开放
- 下一篇: Spring和SpringMVC的总结