原文网址:JVM原理--元空间(MetaSpace)与永久代(PermGen)的区别_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍JVM中元空间(MetaSpace)与永久代(PermGen)的区别。
永久代和元空间与方法区的关系
JVM一共分为五个部分:堆,方法区,虚拟机栈,本地方法栈,程序计数器。
永久代和元空间都属于方法区,都是方法区的实现。
JDK8的的变化
从JDK7 开始,JDK开发者们就开始消灭永久代了,JDK8完全完成:
- 永久代的字面量 (interned strings) 转移到 Java heap; (JDK7完成)
- 永久代的静态变量(class statics) 转移到Java heap ; (JDK7完成)
- 永久代的符号引用(Symbols) 转移到 Native heap ;(JDK7完成)
- 永久代中的 class metadata 转移到 Meta Space; (JDK8完成)
- 永久代参数 (PermSize MaxPermSize) 改为 元空间参数(MetaspaceSize MaxMetaspaceSize)
元空间与永久代的区别
元空间
使用本地内存(native mermory)。
它不属于JVM内存,不受JVM垃圾回收的控制。最大大小取决于系统内存,而不是堆大小。
永久代
使用JVM的内存。
为什么要使用元空间?
原因1:避免OOM异常
使用永久代时
使用永久代时,通常使用 -XX:PermSize 和 -XX:MaxPermSize设置永久代的初始大小和设置永久代的最大值,但是不是总能知道应该设置为多大合适(太小,容易导致永久代溢出;太大,容易导致老年代溢出),如果使用默认值很容易遇到OOM(OutOfMemory)错误。
使用元空间时
JDK8 的方法区是元空间,元空间可以加载多少类的元数据由系统的实际可用空间来控制。
元空间使用本地内存(Native memory)。元空间使用本地内存也就意味着只要本地内存足够,就不会出现OOM的错误。默认情况下元空间大小是无限的。
原因2:将虚拟机进行合并
Oracle想合并HotSpot和JRockit的代码。
元空间里是什么数据?
上边是文章的部分内容,为便于维护,全文已转移到此网址:JVM原理-元空间(MetaSpace)与永久代(PermGen)的区别 - 自学精灵