Java8內存模型—永久代(PermGen)和元空間(Metaspace)

元空間的本質和永久代相似,都是對JVM規範中方法區的實現。

元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。
 

JDK 1.7 和 1.8 將字符串常量由永久代轉移到堆中,而且 JDK 1.8 中已經不存在永久代的結論。html

作這個轉移可能有如下幾點緣由:性能

  一、字符串存在永久代中,容易出現性能問題和內存溢出。spa

  二、類及方法的信息等比較難肯定其大小,所以對於永久代的大小指定比較困難,過小容易出現永久代溢出,太大則容易致使老年代溢出。htm

  三、永久代會爲 GC 帶來沒必要要的複雜度,而且回收效率偏低。blog

  四、Oracle 可能會將HotSpot 與 JRockit 合二爲一。內存

 

默認狀況下,元空間的大小僅受本地內存限制,但能夠經過如下參數來指定元空間的大小:字符串

  -XX:MetaspaceSize,初始空間大小,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:若是釋放了大量的空間,就適當下降該值;若是釋放了不多的空間,那麼在不超過MaxMetaspaceSize時,適當提升該值。
  -XX:MaxMetaspaceSize,最大空間,默認是沒有限制的。get

  除了上面兩個指定大小的選項之外,還有兩個與 GC 相關的屬性:
  -XX:MinMetaspaceFreeRatio,在GC以後,最小的Metaspace剩餘空間容量的百分比,減小爲分配空間所致使的垃圾收集
  -XX:MaxMetaspaceFreeRatio,在GC以後,最大的Metaspace剩餘空間容量的百分比,減小爲釋放空間所致使的垃圾收集虛擬機

 

Java8內存模型—永久代(PermGen)和元空間(Metaspace)

相關文章
相關標籤/搜索