Java虚拟机结构、内存管理相关基础知识(1)

JVM结构体系

jvm由`类加载器子系统`、`运行时数据区`(内存空间)、`执行引擎`及`本地方法接口`等组成
`运行时数据区:`由方法区、堆、java 栈、PC寄存器、本地方法栈组成

在内存空间中方法区是所有java线程共享的,而java栈本地方法栈PC寄存器则有每个线程私有

程序计数器(program counter register)

它是当前线程所执行的字节码的行号指示器
字节码解释器通过改变程序计数器的值来选择下一条需要执行的字节码指令,分支、跳转、循环等基础功能都需要依赖它来实现,所以程序计数器是线程私有的,各线程间的计数器互不影响
当线程在执行一个java方法时(非本地方法),该计数器记录的是正在执行的虚拟机字节码指令的地址,当线程在执行的是native方法时,该计数器的值为空。唯一在java虚拟机规范中没有OOM的区域

Java虚拟机栈(java stacks)

线程私有,保证线程安全,生命周期与线程相同
java栈由栈帧组成,每个方法被执行的时候都会同时创建一个栈帧,调用方法时压入栈帧,方法返回时弹出栈帧并抛弃
先进后出
对于执行引擎来说,活动线程中只有栈顶的栈帧是有效的,执行引擎所运行的所有字节码指令都只针对当前栈帧进行操作
java栈的主要任务是储存方法参数、局部变量、中间运算结果,并且提供部分其他模块工作需要的数据

在编译程序代码时,栈帧中需要多大的局部变量表、多深的操作数栈都已经完全确定来,并且写入了方法表的code属性之中所以程序运行期变量数据不会影响栈帧内存大小,仅仅取决于具体的虚拟机实现。
在java虚拟机规范中,栈会抛出2种异常情况

  • 1、如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowerError异常
  • 2、如果虚拟机在动态扩展栈无法申请到足够的内存空间,则抛出OutOfMemoryError异常

本地方法栈(native method stacks)

与java栈作用类似,java栈为虚拟机执行java方法服务,本地方法栈则为使用到的本地操作系统(native)方法服务

Java堆(Heap)

所有线程共享的一块内存区域。几乎所有的对象实例数组都在这类分配内存
java堆可以处理在物理上不连续的内存空间 中 ,只要是逻辑上是连续就可以
如果在堆中没有内存可分配时,并且堆也无法扩展时,将会抛出OutOfMemoryError异常

方法区(method area)

各个线程共享的内存区域
用于存储已经被虚拟机加载的类信息、常量、静态常量 ,即时编译器编译后的代码等数据。和java heap一样不需要连续的内存,可以选择固定大小或可扩展
虚拟机规范允许该区域可以选择不实现垃圾回收
根据java虚拟机规范,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常

类加载机制

类的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段
类加载的过程包括了:加载->验证->准备 ->解析-> 初始化
顺序开始,而不是按顺序进行完成,通常都是互相交叉地混合进行,在一个阶段执行的过程中调用激活另一个阶段

你可能感兴趣的:(Java虚拟机结构、内存管理相关基础知识(1))