小伙伴你好,元空间是HotSpot在1.8及以后的特定实现,用来代替1.7和之前的永久代,不过元空间并不是JVM内存结构的规范,因为还有其他的虚拟机实现方式,所以课程里的结构图不应当包含元空间。
方法区是 JVM 规范中的定义,是堆的一个逻辑部分,整个虚拟机中只有一个方法区,而永久代是 JVM 规范的一种实现,并且只有在 HotSpot 虚拟机中如此,其他虚拟机中没有永久代的说法。
元空间是1.8加入用来代替永久代的,元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,理论上取决于32位/64位系统可用内存的大小。
为什么要移除持久代,改成元空间?
从内因来说,持久代大小受到-XX:PermSize和-XX:MaxPermSize两个参数的限制,而这两个参数又受到JVM设定的内存大小限制,这就导致在使用中可能会出现持久代内存溢出的问题。而元空间使用的是直接内存,受本机可用内存的限制,不受到JVM内存大小的限制。