jdk1.8jvm内存模型

1.8和1.7的不同

1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。

内存模型

jdk1.8jvm内存模型_第1张图片
1,程序计数器(Program Counter Register)
程序计数器(Program Counter Register)是一块较小的内存空间,它可以是看作当前线程所执行的字节码的行号指示器。说简单一点就是一个计数器,当字节码解释器工作是能够通过改变这个计数器的值来选取下一条需要执行的字节码指令。在说明一点,各条线程之间计数器互不影响,独立存储,程序计数器器内存区域为 线程私有 的。
2,java栈(VM Stack)
Java栈也称作虚拟机栈(Java Vitual Machine Stack),也是常说的栈。Java栈是Java方法执行的内存模型。Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些额外的附加信息。栈也是线程私有的
3,堆(Heap)
堆是jvm内存管理的最大的一块区域,此内存区域的唯一目的就是存放对象的实例,所有对象实例与数组都要在堆上分配内存。它也是垃圾收集器的主要管理区域。java对可以处于物理上不连续的空间,只要逻辑上是连续的即可。线程共享的区域。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将抛出OutOfMemoryError异常。
为了支持垃圾收集,堆被分为三个部分:

  • 年轻代 : 常常又被划分为Eden区和Survivor(From Survivor To Survivor)区(Eden空间、From Survivor空间、To Survivor空间(空间分配比例是8:1:1)
  • 老年代
  • 永久代 (jdk 8已移除永久代)
    jdk1.8jvm内存模型_第2张图片

此区通 方法区(Method Area) 一样线程共享
4,本地方法栈(Native Method Stack)
本地方法栈和虚拟机栈所发挥的作用是很相似的,它们之间的区别不过是 虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。Sun HotSpot 直接就把本地方法栈和虚拟机栈合二为一。本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。
5,元数据
元数据区取代了1.7版本及以前的永久代。
元数据区和永久代本质上都是方法区的实现。
方法区存放虚拟机加载的类信息,静态变量,常量等数据。
6,直接内存
jdk1.4引入了NIO,它可以使用Native函数库直接分配堆外内存。

参考内容

《深入理解Java虚拟机》
JDK1.8 JVM内存模型
Java内存区域与内存溢出异常(jdk 6,7,8)
对于JVM内存模型的理解(对比jdk1.7与1.8)

你可能感兴趣的:(jvm,架构师之路)