Java内存区域详解——程序计数器

Java虚拟机在执行Java程序时会把它所管理的内存划分为如干个不同的数据区域。这些区域都有各自的用途以及创建和销毁的时间,有的区域随着虚拟机的启动而存在,有的区域则依赖用户线程的启动和结束而创建和销毁。
Java内存区域详解——程序计数器_第1张图片

程序计数器

程序计数器时一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条要执行的指令,以此来控制程序的执行过程。程序计数器会随着线程的启动而创建。

  1. 程序计数器中有哪些内容?
package com.java.se;

public class Test {

	public static void main(String[] args) {
		int a=10;
		int b=20;
		if(a>=b)
			System.out.println(a);
		else
			System.out.println(b);

	}

}

上面是一段非常简单的比较大小的程序,我们先编译成Class 文件再使用 javap 反汇编工具看下class 文件中数据格式,来观察计数器会保存哪些内容。

Java内存区域详解——程序计数器_第2张图片图中使用红框框起来的就是字节码指令的偏移地址,与偏移地址对应的右侧部分是操作指令。在程序执行main()方法时会在当前的线程中创建相应的程序计数器,Code也会依次保存在计数器中,程序会按照程序计数器中的地址来执行。由于在程序执行过程中,程序计数器改变的仅仅是偏移地址,所以不需要太大的内存空间,也不会发生内存溢出的情况。

  1. 程序计数器与Java多线程

Java虚拟机的多线程是通过线程轮流切换并分配处理器时间的方式来实现的,在任何一个时刻,一个处理器都只会执行一个线程中的一条指令,因此,为了线程切换后能恢复到正确的位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,故这类内存区域为“线程私有”内存。

  1. 为何执行Native(本地)方法,计数器的值为空(Undefined)?

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

你可能感兴趣的:(深入理解JVM)