JVM在运行时,内存区域中属于程序私有的区域包括:程序计数器、虚拟机栈、本地方法栈。本片文章主要理解程序计数器的相关概念以及工作原理。

一、什么是程序计数器

    程序计数器是记录着当前线程所执行的字节码的行号指示器。

二、为什么需要程序计数器

    Java在编译后的字节码未经过JIT(实时编译器)编译前,其执行方式是通过“字节码解释器”解释执行。可以简单理解为解释器读取装入内存的字节码,按照顺序读区字节码指令,并翻译成指定的操作,并根据这些操作进行计算、跳转、循环等操作。

    从上面的描述,可以怀疑程序计数器还有必要吗?如果程序永远只有一个线程,指令按顺序执行即可,确实程序计数器没有存在的必要。但是Java程序是多线程协同合作执行的,而JVM的多线程是通过CPU的时间片轮转算法实现,也就是说线程可能还没有执行完,但是由于时间片耗尽,不得不挂起,等待下次分配时间片,才能继续执行。所以需要计数器记住被挂起时,程序执行的位置。

三、程序计数器的特点

     1、每个线程私有一个程序计数器。

    2、程序计数器的值为对应线程执行字节码指令的地址。

    3、执行native本地方法时,程序计数器的值为空(Undefined)。因为native方法是java通过JNI直接调用本地C/C++库,可以近似的认为native方法相当于C/C++暴露给java的一个接口,java通过调用这个接口从而调用到C/C++方法。由于该方法是通过C/C++而不是java进行实现。那么自然无法产生相应的字节码,并且C/C++执行时的内存分配是由自己语言决定的,而不是由JVM决定的。

    4、程序计数器占用内存空间很小,几乎可以忽略不计。

    5、唯一一个无OOM的区域