JVM内存模型(JDK8)
2020-12-14 15:24:15 7 举报
JVM内存模型
作者其他创作
大纲/内容
线程共享区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
区别与Java虚拟机栈,Java虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务。也会有StackOverflowError、OutOfMemoryError。
老年代
常量池
用于存放编译器生成的各种字面量和符号引用,编译器和运行期(String的intern())都可以将常量放入池中。内存有限,无法申请时抛出OutOfMemoryError。
线程私有,生命周期与线程一致。Java虚拟机栈是基于线程的,在线程的生命周期中,参与计算的数据会频繁的入栈与出栈,栈里的每条数据就是栈帧。每个Java方法被调用(执行)的时候,都会创建一个栈帧并入栈,一旦完成相应的调用,则出栈,所有的的栈帧都出栈后,线程也就结束了。每个栈帧都包含局部变量表、操作数栈、动态链接、返回地址四个区域。局部变量表: 存放了编译器可知的各种基本数据类型(byte、char、int、short、float、long、double、boolean)、对象引用和returnAddress类型(指向了一条字节码指令的地址)。StackOverflowError: 线程所请求的栈深度大于虚拟机栈所允许的深度。OutOfMemoryError: 如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存。
元空间
区域最大,所有线程共享,主要存放对象实例和数组,是垃圾回收管理的主要区域。可以通过Xmx、Xms控制。OutOfMemoryError: 如果堆中没有内存完成实例分配,并且堆也无法再扩展时,则抛出该异常。普通对象: JVM首先在堆上创建对象,然后在其它地方使用的其实是它的引用。比如,把这个引用保存在虚拟机栈的局部变量表中。基本数据类型: 1.当在方法体中声明了基本数据类型的对象,它就会在栈上直接分配,其它情况都是在堆上分配。2.像int[]数组这样的内容,是在堆上分配的,因为数组不是基本数据类型。
新生代
本地方法栈
较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。与虚拟机栈配合完成计算操作,程序计数器还存储了当前正在运行的流程,包括正在执行的指令、跳转分支、循环、异常处理等。如果线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的字节码地址;如果执行的是Native方法,这个计数器的值则为Undefined。该内存区域是唯一一个在JVM规范中没有任何规定OutOfMemoryError情况的区域。
栈帧
程序计数器
字符串常量池
虚拟机栈
线程隔离的数据区
方法区
运行时常量池
线程共享的数据区
堆
收藏
收藏
0 条评论
下一页