JVM基础04-运行时数据区

1. 什么是运行时数据区?
查看官网描述(JDK8):https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5

翻译一下就是:Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的(方法区和堆,他们是线程共享的),仅在Java虚拟机退出时才被销毁。其他数据区域是每个线程的(Java虚拟机栈、本地发放栈、程序计数器,他们是线程私有的)。在创建线程时创建每个线程的数据区域,并在线程退出时销毁每个数据区域。
注:请回答Java运行时数据区都有哪些?生命周期?

2. Java运行时数据区都有哪些?
2.1 方法区
1)线程共享的,在Java虚拟机启动时创建,退出时销毁
2)它存储每个类的结构,例如运行时常量池,字段(静态变量)和方法数据,以及方法和构造函数的代码,包括用于类和实例初始化以及接口初始化的特殊方法
3)尽管方法区域在逻辑上是堆的一部分,也叫非堆(Non-Heap)但简单的实现可以选择不进行垃圾回收或压缩(因为我们知道堆会进行垃圾回收)。
4)如果方法区无法满足内存分配时会导致OM(OutOfMemoryError)
注:在JDK8之后这部分叫元空间(meta space)

2.2 堆
1)堆是Java虚拟机管理内存最大的一块,Java虚拟机启动时创建,线程共享。
2)堆存放的是对象实例和数组
3)堆可划分为老年代和新生代(为什么要划分,我们讲JVM模型色时候会仔细讲解)

2.3 Java虚拟机栈
1)虚拟机栈是一个线程执行的区域,保存着一个线程中方法的调用状态。换句话说,一个Java线程的运行状态,由一个虚拟机栈来保存,所以虚拟机栈肯定是线程私有的,独有的,随着线程的创建而创建。
2)每个被线程调用的方法对应于一个栈帧。也就是多调用一个方法对应于一个栈帧在虚拟机栈的压栈,调用完成后则弹出。
3)理解栈帧:每个栈帧中包括局部变量表、操作数栈、动态链接、方法返回地址和附加信息
①局部变量表:方法的局部变量、及参数
②操作数栈:压栈和出栈的方式存储操作数
③动态链接:栈帧包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接(Dynamic Linking)。
④方法返回地址:方法返回的字节码指令
图解如下:


2.4 程序计数器
如果线程正在执行Java方法,则计算器记录的是正在执行的字节码指令的地址
如果是本地方法,则计数器为0

2.5 本地方法栈
Native类型的方法在本地方法栈中执行,Java虚拟机栈可通过动态链接来指向本地方法栈执行本地方法。

2.6 堆、方法区、栈的指向关系示例
1)堆指向栈 Object obj=new Object()
2)   方法区指向堆  static Object = new Object()
3)堆指向方法区 this.字段

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章