Java基礎學習總結(119)——Java8 JVM與Java7 JVM比較

一杯甜酒發表於2017-11-26
jdk 7的jvm 記憶體分配,請看下圖:
在JDK7以及其前期的JDK版本中,JVM空間可以分成三個大區,新生代、老年代、永久代。其中新生代可以劃分為三個區,Eden區,兩個倖存區。
一個物件被建立以後首先被放到新生代中的Eden內
存中,如果存活期超兩個Survivor之後就會被轉移到老年代(Old Generation)中。
永久記憶體中存放著物件的方法、變數等後設資料資訊。通過如果永久記憶體不夠,我們就會得到如下錯誤:
java.lang.OutOfMemoryError: PermGen
JDK8 HotSpot JVM 將移除永久區,使用本地記憶體來儲存類後設資料資訊並稱之為:元空間(Metaspace);
永久代被移除後它的JVM引數:PermSize 和 MaxPermSize 會被忽略並給出警告(如果在啟用時設定了這兩個引數)。
Metaspace 容量
預設情況下,類後設資料只受可用的本地記憶體限制(容量取決於是32位或是64位作業系統的可用虛擬記憶體大小)。
新引數(MaxMetaspaceSize)用於限制本地記憶體分配給類後設資料的大小。如果沒有指定這個引數,元空間會在執行時根據需要動態調整。
Metaspace 垃圾回收
對於僵死的類及類載入器的垃圾回收將在後設資料使用達到“MaxMetaspaceSize”引數的設定值時進行。
適時地監控和調整元空間對於減小垃圾回收頻率和減少延時是很有必要的。持續的元空間垃圾回收說明,可能存在類、類載入器導致的記憶體洩漏或是大小設定不合適。

相關文章