JVM内存模型

总览

图片alt

JVM标准中的五个组成部分

  • 方法区
  • 程序计数器
  • 本地方法栈
  • 虚拟机栈

JDK1.7的运行时数据区

图片alt

  • 永久代是方法区的实现
  • jdk1.6之前字符串常量池在方法区
  • jdk1.7之后字符串常量池被移动到堆区

JDK1.8的运行时数据区

图片alt

  • jdk1.8去掉了永久代
  • 引入了元数据区
  • Jdk1.7中的运行时常量池移动到元数据区
  • 元数据区存在于直接内存中

为什么移除永久代

方法区大小难以设定,容易发生内存溢出。永久代存放着Class相关信息,一般信息在编译期就能确定,但是如果在一些动态生成的Class的应用中,如:Spring中的动态代理,大量的JSP页面或动态生成的JSP页面,由于方法区在一开始就要分配好,因此难以确定大小,容易发生内存溢出。
GC复杂效率低,方法区存放元数据和各种常量,但是这些数据被类的实例所引用,导致垃圾回收非常困难.
促进HotSpot VM和JRockit VM融合,JRockit VM没有方法区

什么是元空间

元空间永久代类似都是对JVM规范中方法区的实现。区别在于元空间不在JVM虚拟机中,因此元空间的空间受本地内存制约。

元空间特点

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

图片alt

返回笔记列表
入门小站