一、初识JVM的运行时数据区

JVM中运行时数据区分为两种,一种是生命周期和JVM相同,随JVM启动而创建,随JVM销毁而销毁;另一种是生命周期和线程相同,随线程启动而创建,随线程销毁而销毁。

一、初识JVM的运行时数据区_第1张图片

虚拟机栈:生命周期和线程相同,是线程私有的;栈中存放的是栈帧,每调用一次方法代表着一个栈帧的入栈,每一个方法执行完成代表一个栈帧出栈;在虚拟机规范中允许栈设计成固定大小或者是可以动态扩缩容,常用的虚拟机hotspot的栈是动态扩缩容的;当一个线程需要的内存空间大于栈允许的内存空间,JVM会抛出StackOverflowError异常;当可以扩缩容的栈尝试扩容时发现内存空间不足,或者在创建新的线程时发现内存空间不足,JVM会抛出OutOfMemoryError异常。

栈帧:虚拟机栈中出栈入栈操作的就是栈帧,栈帧中存放了执行一个方法必须的元素,主要包括本地变量表,操作数栈,动态链接;本地变量表的大小在编译器就已经确定了,变量表中可以存储8种基本类型,引用地址(reference)和返回地址(returnAddress),其中long和double需要占用两位;操作数栈是基于LIFO的栈实现的,主要用于计算;动态链接主要将调用方法和变量时的符号引用转换为具体的方法引用;如果一个方法调用的另一个方法存在返回值,那么在正常方法调用结束的情况下会将这个返回值放到当前栈帧(线程当前正在执行的方法)的操作数栈中。

本地方法栈:主要用于执行一些非java语言编写的方法,而虚拟机栈用于执行java语言编写的方法;其他和虚拟机栈没有差别。

PC 计数器:生命周期和线程相同,是线程私有的,用于存储代码执行位置,如果调用的是java方法,pc计数器中存储的是当前代码执行的位置;如果是本地方法,pc计数器中不存储数据;pc计数器是唯一一个不会发生OutOfMemoryError异常的运行时数据区。

:生命周期和JVM相同,是线程共同拥有的;堆中存放着几乎所有的对象实例和数组;如果内存空间不足,会抛出OutOfMemoryError异常,堆也是GC管理的内存空间。

方法区:生命周期和JVM相同,是线程共同拥有的;存放着每个类的结构包括运行时常量池,变量,方法数据,方法代码,构造器等;如果内存空间不足,会抛出OutOfMemoryError异常。

运行时常量池:每个类文件都会存在一个运行时常量池,用于存储一些常量,包含从编译时已知的字面量到在运行时需要被解析的方法和字段引用。

你可能感兴趣的:(JVM,jvm,java)