总览
JVM规范中的五个组成部分
- 办法区
- 堆
- 程序计数器
- 本地办法栈
- 虚拟机栈
JDK1.7的运行时数据区
- 永恒代是办法区的实现
- jdk1.6之前
字符串常量池
在办法区 - jdk1.7之后
字符串常量池
被挪动到堆区
JDK1.8的运行时数据区
- jdk1.8去掉了永恒代
- 引入了元数据区
- Jdk1.7中的
运行时常量池
挪动到元数据区
元数据区
存在于间接内存中
为什么移除永恒代
办法区大小难以设定,容易产生内存溢出。永恒代寄存着Class相干信息,个别信息在编译期就能确定,然而如果在一些动静生成的Class的利用中,如:Spring中的动静代理,大量的JSP页面或动静生成的JSP页面,因为办法区在一开始就要调配好,因而难以确定大小,容易产生内存溢出。
GC简单效率低,办法区寄存元数据和各种常量,然而这些数据被类的实例所援用,导致垃圾回收十分艰难.
促成HotSpot VM和JRockit VM交融,JRockit VM没有办法区
什么是元空间
元空间
和永恒代
相似都是对JVM标准中办法区
的实现。区别在于元空间
不在JVM虚拟机中,因而元空间
的空间受本地内存制约。
元空间特点
- 每个加载器都有本人的空间
- 不会独自回收某个类
- 元空间对象的地位是固定的
- 如果发现某个加载器不在存活,则将整个空间回收