数据运行时数据区域
Java虚拟机在执行Java程序过程中会将它管理的内存分成若干个不同的数据区域,不同的数据区域用途不同,内存的管理(创建和销毁)不同,如下图是Java虚拟机中数据的区域模型图。
图1-1 Java 虚拟机运行时数据区程序计数器
程序计数器(Program Counter Register)是一块比较小的内存空间,通过改变计数器的值来选取下一条需要执行的字节码指令,是程序控制流的指示器,分支、循环、跳转、异常、线程恢复等基础功能都是需要依赖计数器来完成。每条线程都是有一个独立的程序计数器,线程之前互相没有影响,这样在多线程中可以很容易的管理每个线程需要执行的下一个代码是什么(字节码指令)。如果线程正在执行Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是本地方法,则计数器的值为空(Undefined)。程序计数器是唯一一个不会发生OutOfMemoryError的内存区域。
总结:
- 程序计数器是线程私有的内存空间,主要记录线程需要执行的下一个字节码指令地址,不会发生OOM
- 线程执行本地方法时,计数器记录的值为空
- 内存的生命周期是伴随着线程的创建而创建,销毁而销毁,而且占用空间非常小
思考:
- 是如何保障顺序的,也就是字节码指令执行前就记录下一条?还是执行完再记录下一条指令地址。
A:首先程序计数器记录的是当前执行的指令地址,程序计数器其实不保证整个代码的顺序,一个线程的代码执行顺序使用通过栈的数据结构来控制的。- 如何保障一致性,记录的字节码指令是否真的执行成功,执行失败怎么办
- 在执行本地方法时计数器的值是空,为什么
引用
- 《深入理解Java虚拟·JVM高级特性与最佳实践 第3版》周志明
网友评论