美文网首页JVM
Java程序计数器刨根问底

Java程序计数器刨根问底

作者: 逗逼程序员 | 来源:发表于2020-01-14 15:00 被阅读0次

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

img

1、什么是程序计数器?

程序计数器是当前线程正在执行的字节码的地址,程序计数器是线程隔离的,每一个线程再工作的时候都有一个独立的程序计数器。

2、字节码的执行原理

编译后的字节码在没有经过JIT(即时编译器)编译前,是通过字节码解释器解释执行。其执行原理为:字节码解释器读取内存中的字节码,按照顺序读取字节码指令,读取一个指令就将其翻译成固定的操作,跟进这些操作进行分支,循环,跳转等动作。

即时编译(英语:Just-in-time compilation,缩写:JIT)又译及时编译实时编译动态编译的一种形式, 是一种提高程序运行效率的方法。 通常,程序有两种运行方式:静态编译与动态解释。 静态编译的程序在执行前全部被翻译为机器码, 而解释执行的则是一句一句边运行边翻译。

即时编译器则混合了这二者,一句一句编译源代码, 但是会将翻译过的代码缓存起来以降低性能损耗。 相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。

即时编译器有两种类型,一是字节码翻译,二是动态编译翻译。

3、程序计数器的作用

从字节码执行原理来看,单线程的情况下程序计数器是可以有可无的。因为即使没有程序计数器的情况下,程序也会按照指令顺序执行下去,即使遇到了分支跳转也会按照跳转指定的指令处,继续执行下去,是完全能够保证执行顺序的。

但是现实中程序往往是多线程协调完成任务的。JVM的多线程是通过CPU时间片轮转来实现的, 某个线程在执行的过程中可能会因为时间片耗尽而被挂起。当它在此获取到时间片时,需要从挂起的地方继续执行。在JVM 中,通过程序计数器来记录程序的字节码执行位置。程序计数器具有线程隔离性,每个线程拥有自己的程序计数器。

4、程序计数器特点

  • 程序计数器具有线程隔离特点
  • 程序计数器占用的空间非常小,可以忽略不计
  • 程序计数器是 java 虚拟机规范中唯一一个没有规定任何OutofMemeryError 的区域
  • 程序运行的时候,程序计数器是有值的,其记录的是正在执行的字节码的地址
  • 执行native 本地方法时,程序计数器的值为空,原因是native 方法是java 通过jni 调用本地C/C++库来实现, 非java 字节码实现,所以无法 统计。

相关文章

  • Java程序计数器刨根问底

    JAVA虚拟机管理的内存区域图 1、什么是程序计数器? 程序计数器是当前线程正在执行的字节码的地址,程序计数器是线...

  • JVM系列之内存结构

    JVM区域划分 程序计数器、Java 堆、Java 虚拟机栈、元数据区和本地方法栈 程序计数器 程序计数器是当前线...

  • Java虚拟机的运行时数据区域

    Java虚拟机的运行时数据区域有程序计数器、虚拟机栈、本地方法栈、堆和方法区。 程序计数器 程序计数器,程序计数器...

  • Java内存区域与内存溢出异常

    1、Java虚拟机运行时数据区 2、程序计数器 程序计数器(Program Counter Register)是一...

  • jvm-01 java内存区域与内存模型

    1.java虚拟机运行时数据区域 2. 程序计数器 程序计数器(Program Counter Register)...

  • JVM基础之内存

    Java内存介绍 Java运行时数据区分为下面几个部分: 程序计数器;程序计数器是线程私有的,一块较小的内存空间,...

  • Java程序计数器刨根问底,大部分程序员都收藏起来了

    JAVA虚拟机管理的内存区域图 1.什么是程序计数器? 程序计数器是当前线程正在执行的字节码的地址。程序计数器是线...

  • 【JVM】1、Java内存区域

    程序计数器(Program Counter Register) Java虚拟机栈(Java Virtual Mac...

  • JAVA 内存区域 笔记

    程序计数器(Program Counter Register) Java虚拟机栈(Java Virtual Mac...

  • JVM

    JAVA运行时数据区域 1.程序计数器程序计数器(Program Counter Register) 是一块较小的...

网友评论

    本文标题:Java程序计数器刨根问底

    本文链接:https://www.haomeiwen.com/subject/cohaactx.html