【JVM】运行时数据区
方法区(Method Area)
作用
- 存储已被虚拟机加载的类信息(类的版本、字段、方法、接口等描述)、运行时常量池(Runtime Constant Pool)、常量、静态变量、即时编译器编译后的代码(如JSP)等数据。
特性
- 在虚拟机启动时创建
- 各个线程共享
- 堆的一个逻辑部分,非堆(Non-Heap)
- 无法满足内存分配需求时,将抛出
OutOfMemoryError
异常。 - JDK>=8:Metaspace;JDK<8:Perm Space
堆(Heap)
作用
- 存储Java对象实例以及数组
特性
- 虚拟机启动时创建
- 各个线程共享
- Java虚拟机所管理内存中最大的一块
- 无法满足内存分配需求时,将抛出
OutOfMemoryError
异常。
对象内存布局
虚拟机栈(JVM Stacks)
作用
- 存储一个Java线程的运行状态
特性
- 随着线程的创建而创建
- 线程私有
- 栈帧太多耗尽栈空间,将抛出
StackOverflow
异常
栈帧
官网参考:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6
定义
- 每一个被线程执行的方法
操作
- 压栈:调用一个方法,压入一个栈帧
- 出栈:方法调用完成,把该栈帧从栈中弹出
组成部分
局部变量表(Local Variables)
- 组成部分:方法中定义的局部变量和方法的参数
- 使用方式:通过相关指令将其加载至操作数栈中作为操作数使用
操作数栈(Operand Stack)
- 以压栈和出栈的方式存储操作数
动态链接
- 指向运行时常量池的引用(A reference to the run-time constant pool)
方法返回地址(Return Address)
- 存放调用该方法的PC寄存器的值。也就是调用该方法的位置。
附加信息
本地方法栈(Native Method Stacks)
作用
- 存储Native方法,如果当前线程执行的方法是Native类型的,这些方法就会在本地方法栈中执行。
- Native Stack与Java Stack所发挥的作用非常相似,他们之间的区别在于Java Stack为Java Stack执行Java方法(也就是字节码)服务,而Native Stack则为使用到Native方法服务。
程序计数器(PC Register)
作用
- 记录线程执行的位置,为了线程切换后能够恢复到正确的执行位置
特性
- 随着线程的创建而创建
- 线程私有
- 线程正在执行Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址;正在执行的是Native方法,则这个计数器为空。
联系
栈指向堆
在栈帧中有引用类型的变量,比如Object obj=new Object()
方法区指向堆
方法区中存放引用类型的静态变量,比如private static Object obj = new Object();
评论区