JAVA虚拟机管理的内存区域图

1、什么是程序计数器?
程序计数器是当前线程正在执行的字节码的地址,程序计数器是线程隔离的,每一个线程再工作的时候都有一个独立的程序计数器。
2、字节码的执行原理
编译后的字节码在没有经过JIT(即时编译器)编译前,是通过字节码解释器解释执行。其执行原理为:字节码解释器读取内存中的字节码,按照顺序读取字节码指令,读取一个指令就将其翻译成固定的操作,跟进这些操作进行分支,循环,跳转等动作。
即时编译(英语:Just-in-time compilation,缩写:JIT)又译及时编译 ,实时编译,动态编译的一种形式, 是一种提高程序运行效率的方法。 通常,程序有两种运行方式:静态编译与动态解释。 静态编译的程序在执行前全部被翻译为机器码, 而解释执行的则是一句一句边运行边翻译。
即时编译器则混合了这二者,一句一句编译源代码, 但是会将翻译过的代码缓存起来以降低性能损耗。 相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。
即时编译器有两种类型,一是字节码翻译,二是动态编译翻译。
3、程序计数器的作用
从字节码执行原理来看,单线程的情况下程序计数器是可以有可无的。因为即使没有程序计数器的情况下,程序也会按照指令顺序执行下去,即使遇到了分支跳转也会按照跳转指定的指令处,继续执行下去,是完全能够保证执行顺序的。
但是现实中程序往往是多线程协调完成任务的。JVM的多线程是通过CPU时间片轮转来实现的, 某个线程在执行的过程中可能会因为时间片耗尽而被挂起。当它在此获取到时间片时,需要从挂起的地方继续执行。在JVM 中,通过程序计数器来记录程序的字节码执行位置。程序计数器具有线程隔离性,每个线程拥有自己的程序计数器。
4、程序计数器特点
- 程序计数器具有线程隔离特点
- 程序计数器占用的空间非常小,可以忽略不计
- 程序计数器是 java 虚拟机规范中唯一一个没有规定任何OutofMemeryError 的区域
- 程序运行的时候,程序计数器是有值的,其记录的是正在执行的字节码的地址
- 执行native 本地方法时,程序计数器的值为空,原因是native 方法是java 通过jni 调用本地C/C++库来实现, 非java 字节码实现,所以无法 统计。
网友评论