JVM的内存模型详解_jvm内存模型及作用
总体架构图中,JVM内存模型主要包括三个系统:
- 类加载系统:负责加载Java类的字节码文件,并将其转换为JVM内部的数据结构。
- 运行时数据区:用于存储JVM运行时需要的各种数据
- 方法区:存储类的结构信息(如类、方法、构造函数等)、运行时的常量池等。
- 堆:存储JAVA对象实例及数组,是垃圾回收的主要区域,它主要分为新生代和老年代,刚创建的对象在新生代的Eden区中,经过GC后进入新生代的S0区中,再经过GC进入新生代的S1区中,15次GC后仍存在就进入老年代,这是按照一种回收机制进行划分的,不是固定的,若堆空间不够,则会包OutOfMemoryError。
- 栈:包含虚拟机栈、程序计数器、本地方法栈。
虚拟机栈:线程私有的,与线程在同一时间创建、每个方法执行时都会创建一个桢栈来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息。栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数可以设置虚拟机栈大小),当方法执行完毕之后,便会将栈帧出栈。因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。栈的大小可以是固定的,或者是动态扩展的。如果请求的栈深度大于最大可用深度,则抛出stackOverflowError;如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutofMemoryError。
程序计数器:线程私有的,同时它也被称为PC寄存器,当线程数超过CPU数或其内核数时,就要通过时间片轮询分派CPU的时间资源,生命周期与线程一致,生命周期随着线程启动而产生,随线程结束而消亡。每个线程就需要一个属于自己的计数器来记录下一条要运行的指令。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为空。
本地方法栈:线程私有的,与虚拟机栈作用相似。但它不是为Java方法服务的,而是本地方法(C语言),都会抛出OutOfMemoryError和StackOverFlowError。
- 执行引擎:负责执行JVM中的字节码指令。
执行引擎是 java 虚拟机的最核心组件之一,它负责执行虚拟机的字节码,采用解释执行方式。解释执行是指解释器通过每次解释并执行一小段代码来完成.class程序的所有操作。即时编译则是将.class文件翻译成机器码在执行。
Java程序的每一个线程都是一个独立的虚拟机执行引擎的实例。从线程生命周期的开始到结束,它要么在执行字节码,要么执行本地方法。