Java虚拟机所管理的内存将会包括以下几个运行时区域,如下图所示。
一.程序计数器
1.概念
程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行字节码的行指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。
由于Java虚拟机的多线程是通过线程轮流切换,分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。
2.总结
- 线程私有
- 记录指令来控制程序的指令执行顺序,对分支,循环等行为进行控制
- 记录线程的执行顺序
- 正在执行时,如果是Java方法,记录指令地址,如果是本地方法,为空
- 唯一一个无OutOfMemoryError情况的区域
这里顺便说一下Java方法和本地方法:
java方法: