定義
所有java 虛擬機(jī)線程共享的一塊區(qū)域,存儲(chǔ)了所有類(lèi)相關(guān)信息熬荆,在虛擬機(jī)啟動(dòng)時(shí)被創(chuàng)建,JVM關(guān)閉就會(huì)釋放方法區(qū)的空間。不同版本實(shí)現(xiàn)方式不同辕漂。例如永久代,元空間注祖。
JDK1.6及之前:永久代谓厘。靜態(tài)變量在永久代中
JDK1.7 :永久代。字符串常量池悠夯、靜態(tài)變量移除癌淮,放入堆中。
JDK1.8及之后的實(shí)現(xiàn)方式:元空間沦补。不在虛擬機(jī)設(shè)置的內(nèi)存中乳蓄,而是使用本地內(nèi)存。類(lèi)信息夕膀、字段虚倒、方法、常量保存在本地內(nèi)存产舞,但字符串常量池魂奥、靜態(tài)變量仍在堆中。
方法區(qū)的內(nèi)部結(jié)構(gòu)
類(lèi)的信息易猫、屬性耻煤、方法、異常表等准颓。其中有他們的全類(lèi)名哈蝇,返回類(lèi)型,權(quán)限修飾符等
被final修飾的屬性在編譯的時(shí)候就賦值了攘已。
方法區(qū)內(nèi)存溢出
類(lèi)加載的個(gè)數(shù)過(guò)多
1. 1.8以前會(huì)導(dǎo)致永久代內(nèi)存溢出(使用MaxPermSize設(shè)置永久代大信谏狻)
2.?1.8以后會(huì)導(dǎo)致元空間內(nèi)存溢出(使用系統(tǒng)內(nèi)存,可以使用MaxMetaSpace設(shè)置元空間大泄岜弧)
溢出場(chǎng)景
加載大量的第三方的jar包:Tomcat部署的工程過(guò)多(30-50個(gè)):大量動(dòng)態(tài)的生成反射類(lèi)
?實(shí)際場(chǎng)景中spring眼五,mybatis:會(huì)產(chǎn)生大量的動(dòng)態(tài)生成類(lèi)
演示溢出
設(shè)置方法區(qū)內(nèi)存大小
JDK 7 以前:
-XX:PermSize=100m
-XX:MaxPermSize=100m
JDK8及以后:
-XX:MetaspaceSize=100m
-XX:MaxMetaspaceSize=100m
如何解決OOM
方法區(qū)可以有垃圾回收也可以沒(méi)有妆艘,方法區(qū)的垃圾收集主要回收兩部分內(nèi)容:常量池中廢棄的常量和不再使用的類(lèi)型。