总览
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虚拟机中,因此元空间的空间受本地内存制约。
元空间特点
每个加载器都有自己的空间不会单独回收某个类元空间对象的位置是固定的如果发现某个加载器不在存活,则将整个空间回收