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)

相关文章
相关标签/搜索