1. 運行時常量池和靜態變量都存儲到了堆中,MetaSpace存儲類的元數據,MetaSpace直接申請在本地內存中(Native memory),這樣類的元數據分配只受本地內存大小的限制,OOM問題就不存在了。除此以外,還有其餘不少好處:html
2. 其實,移除永久代的工做從JDK1.7就開始了。JDK1.7中,存儲在永久代的部分數據就已經轉移到了Java Heap或者是 Native Heap。但永久代仍存在於JDK1.7中,並沒徹底移除,譬如符號引用(Symbols)轉移到了native heap;java
字面量(interned strings)轉移到了java heap;類的靜態變量(class statics)轉移到了java heap。jvm
3. JDK8 HotSpot JVM 將移除永久區,使用本地內存來存儲類元數據信息並稱之爲:元空間(Metaspace)。這意味着不會再有java.lang.OutOfMemoryError: PermGen問題,也再也不須要你進行調優及監控內存空間的使用。性能
總結:spa
PermGen空間情況:這部份內存空間將所有移除。JVM的參數:PermSize 和 MaxPermSize 會被忽略並給出警告(若是在啓用時設置了這兩個參數)。操作系統
Metaspace 容量:默認狀況下,類元數據只受可用的本地內存限制(容量取決因而32位或是64位操做系統的可用虛擬內存大小)。新參數(MaxMetaspaceSize)用於限制本地內存分配給類元數據的大小。若是沒有指定.net
這個參數,元空間會在運行時根據須要動態調整。調試
另外,對於僵死的類及類加載器的垃圾回收將在元數據使用達到「MaxMetaspaceSize」參數的設定值時進行。適時地監控和調整元空間對於減少垃圾回收頻率和減小延時是頗有必要的。持續的元空間垃圾回收說明,htm
可能存在類、類加載器致使的內存泄漏或是大小設置不合適。blog
4. 總結
1). 以前不論是不是須要,JVM都會吃掉那塊空間……若是設置得過小,JVM會死掉;若是設置得太大,這塊內存就被JVM浪費了。理論上說,如今你徹底能夠不關注這個,由於JVM會在運行時自動調校爲「合適的大小」;
2). 提升Full GC的性能,在Full GC期間,Metadata到Metadata pointers之間不須要掃描了,別小看這幾納秒時間;
3). 隱患就是若是程序存在內存泄露,像OOMTest那樣,不停的擴展metaspace的空間,會致使機器的內存不足,因此仍是要有必要的調試和監控。
5. 深刻理解元空間(Metaspace)
1). 元空間的內存大小
元空間是方法區的在HotSpot jvm 中的實現,方法區主要用於存儲類的信息、常量池、方法數據、方法代碼等。方法區邏輯上屬於堆的一部分,可是爲了與堆進行區分,一般又叫「非堆」。
元空間的本質和永久代相似,都是對JVM規範中方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。,理論上取決於32位/64位系統可虛擬的內存大小。可見也不是無限制的,須要配置參數。
2). 經常使用配置參數
a. MetaspaceSize
初始化的Metaspace大小,控制元空間發生GC的閾值。GC後,動態增長或下降MetaspaceSize。在默認狀況下,這個值大小根據不一樣的平臺在12M到20M浮動。使用Java -XX:+PrintFlagsInitial命令查看本機的初始化參數
b. MaxMetaspaceSize
限制Metaspace增加的上限,防止由於某些狀況致使Metaspace無限的使用本地內存,影響到其餘程序。在本機上該參數的默認值爲4294967295B(大約4096MB)。
c. MinMetaspaceFreeRatio
當進行過Metaspace GC以後,會計算當前Metaspace的空閒空間比,若是空閒比小於這個參數(即實際非空閒佔比過大,內存不夠用),那麼虛擬機將增加Metaspace的大小。默認值爲40,也就是40%。
設置該參數能夠控制Metaspace的增加的速度,過小的值致使Metaspace增加的緩慢,Metaspace的使用逐漸趨於飽和,可能會影響以後類的加載。而太大的值會致使Metaspace增加的過快,浪費內存。
d. MaxMetasaceFreeRatio
當進行過Metaspace GC以後, 會計算當前Metaspace的空閒空間比,若是空閒比大於這個參數,那麼虛擬機會釋放Metaspace的部分空間。默認值爲70,也就是70%。
e. MaxMetaspaceExpansion
Metaspace增加時的最大幅度。在本機上該參數的默認值爲5452592B(大約爲5MB)。
f. MinMetaspaceExpansion
Metaspace增加時的最小幅度。在本機上該參數的默認值爲340784B(大約330KB爲)。