总览

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虚拟机中,因而元空间的空间受本地内存制约。

元空间特点

  • 每个加载器都有本人的空间
  • 不会独自回收某个类
  • 元空间对象的地位是固定的
  • 如果发现某个加载器不在存活,则将整个空间回收