在HotSpot中,永久代是方法區的實現,存放著類資訊,常量靜態變數等。但是在這種情況下有一個問題,如果類的後設資料大小超過了應用的可分配記憶體,那麼就會出現記憶體溢位問題。
在JDK1.8後,永久代被移除,永久代中的資訊存放在了元空間。
兩者最大的區別:元空間並不在虛擬機器中,而是使用本地記憶體。
因此,預設情況下元空間是不受虛擬機器記憶體大小的限制的,只受到系統記憶體的限制。
但可以通過以下引數來指定元空間的大小:
-XX:MetaspaceSize,初始空間大小,達到該值就會觸發垃圾收集進行型別解除安裝,同時GC會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那麼在不超過MaxMetaspaceSize時,適當提高該值。
-XX:MaxMetaspaceSize,最大空間,預設是沒有限制的。
除了上面兩個指定大小的選項以外,還有兩個與 GC 相關的屬性:
-XX:MinMetaspaceFreeRatio,在GC之後,最小的Metaspace剩餘空間容量的百分比,減少為分配空間所導致的垃圾收集
-XX:MaxMetaspaceFreeRatio,在GC之後,最大的Metaspace剩餘空間容量的百分比,減少為釋放空間所導致的垃圾收集。
採用元空間而不用永久代的幾點原因:(參考:http://www.cnblogs.com/paddix/p/5309550.html)
- 字串存在永久代中,容易出現效能問題和記憶體溢位。
- 類及方法的資訊等比較難確定其大小,因此對於永久代的大小指定比較困難,太小容易出現永久代溢位,太大則容易導致老年代溢位(因為堆空間有限,此消彼長)。
- 永久代會為 GC 帶來不必要的複雜度,並且回收效率偏低。
- Oracle 可能會將HotSpot 與 JRockit 合二為一。