运行时内存区域这块,如果不将内存各个区域做什么的了解清楚,后面看的会很累。
之前将JVM运行时内存区域的内容,整理在了一篇文章中。
在后续深入、细致的学习中,整理的内容越来越多,一篇的话,会导致篇幅过长。
所以将《JVM运行时内存区域详解》分为以下几个章节:
这里将《Java虚拟机规范中文版》上传了,点击下面链接,即可下载
目录
《Java Virtual Machine Specification Java SE 7 中文版》
程序计数器(PC寄存器)
《深入理解Java虚拟机:JVM高级特性与最佳实践》
程序计数器(PC寄存器)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器只会执行一条线程中的指令。
因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的程序计数器互不影响,独立存储,称这类内存区域为“线程私有”的内存。
如果线程执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码的地址。
如果线程执行的是一个Native方法,这个计数器值则为空。
此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError的区域。
《Java Virtual Machine Specification Java SE 7 中文版》
Java 虚拟机可以支持多条线程同时执行(可参考《 Java 语言规范》第 17 章),每一条Java虚拟机线程都有自己的 PC( Program Counter)寄存器。
在任意时刻,一条 Java 虚拟机线程只会执行一个方法的代码,这个正在被线程执行的方法称为该线程的当前方法( Current Method, §2.6)。
如果这个方法不是 native 的,那 PC 寄存器就保存 Java 虚拟机正在执行的字节码指令的地址,如果该方法是 native 的,那 PC 寄存器的值是 undefined。
PC 寄存器的容量至少应当能保存一个 returnAddress 类型的数据或者一个与平台相关的本地指针的值。