文章目录
元空间(Meta Space)
1、元空间的基本介绍
在Java 8 中称为元空间(Meta Space),在Java 7 及以前称为方法区。
-
和Java堆一样,是
各个线程共享的内存区域
。 -
在
JVM启动时候被创建
,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的
-
元空间的大小,跟堆空间一样,可以选择固定大小或者可拓展
-
元空间的大小
决定了系统可以保存多少类
,如果系统定义了太多的类
,导致元空间内存溢出
,虚拟机同样会抛出内存溢出错误
:java.lang.OufOfMemoryError:PermGen Space或者java.lang.OutOfMemoryError:Metaspce
- 加载大量的Jar包
-
关闭JVM
就会释放这个区域的内存
2、Meta Space的演进
-
JDK 8之前
,习惯上称方法区为永久代
,JDK 8开始
,使用元空间替代了永久代
。 -
本质上
:方法区
和永久代
并不相等
,只是对Hotspot
来说的,《Java虚拟机规范》对如何实现方法区,不做统一的要求
。- 从现在的角度来看,之前使用永久代,不是很好的实现方式,导致
Java程序更容易OOM
- 从现在的角度来看,之前使用永久代,不是很好的实现方式,导致
-
JDK 8完全废弃了永久代的概念,改用和JRockit J9一样在本地内要中实现
元空间(Metaspce)来代理。
-
元空间本质上和永久代类似,都是对JVM规范中方法区的实现,不过元空间与永久代最大的区别在于
- 元空间不在虚拟机设置的中,而是使用本地内存。
永久代、元空间二者
不只是名字的改变,内部结果也调整了
- 根据《Java虚拟机规范》的的规定,如果
元空间无法满足新内存分配需求时
,将抛出OOM异常
。
永久代为什么要被元空间替换
随着Java 8的到来