精华内容
下载资源
问答
  • Java 程序计数器

    2019-12-21 12:22:04
    程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。 在概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、...

    Java 程序计数器

    1. 概述

    • 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码行号指示器
    • 在概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成
    • Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多喝处理器来说是一个内核)只会执行一条线程中的指令。
    • 因此,为了线程切换后能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,称这类内存区域为**“线程私有”**的内存。
    • 如果线程现在正在执行的是一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址
    • 如果线程正在执行的是 Native 方法,这个计数器值则为空(Undefined)(Native方法是非Java语言编写,比如c/c++,它们无法在 Java 编译时生成字节码,即JVM 获取不到 native 实现, 只能通过系统指令去调用native方法)
    • 此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError情况的区域

    2.特点

    • 占内存很小,唯一不会规定任何 OutOfMemoryError情况
    • 线程私有
    • 对java方法是字节码指令的地址,对 Native 方法是 Undefined

    3.举例子理解

    package PC;
    
    public class Demo {
        public int fun() {
            int a = 100;
            int b = 200;
            int c = 300;
            return (a + b) * c;
        }
    }
    

    将class文件反编译之后,数字部分就是字节码指令的偏移量,bipush之类的是jvm的操作指令,当执行fun()方法时,在当前线程中就会创建相应的程序计数器,在计数器中存放执行地址。
    反编译结果

    之后希望可以分享一些有关于多线程以及Native方法的相关总结。

    展开全文
  • 程序计数器(program counter register)只占用了一块比较小内存空间,至于小到什么程度呢,这样说吧,有时可以忽略不计作用 可以看作是当前线程所执行字节码文件(class)行号指示器。在虚拟机...
    1. 简述

      程序计数器(program counter register)只占用了一块比较小的内存空间,至于小到什么程度呢,这样说吧,有时可以忽略不计的。

    2. 作用

      可以看作是当前线程所执行的字节码文件(class)的行号指示器。在虚拟机的世界中,字节码解释器就是通过改变计数器的值来选取下一条执行的字节码指令,分支、循环、跳转、异常处理、线程恢复都需要这玩意来实现的,NB吗?

    3. 特性
      1. 因为处理器在一个确定是时刻只会执行一个线程中的指令,线程切换后,是通过计数器来记录执行痕迹的,因而可以看出,程序计数器是每个线程私有的。
      2. 如果执行的是java方法,那么记录的是正在执行的虚拟机字节码指令的地址的地址,如果是native方法,计数器的值为空(undefined)。
      3. 这个内存区域是唯一一个在java虚拟界规范中没有规定任何OutOfMemoryError的情况的区域。至于为什么没有这个异常呢,要是一个计数的功能在出这个异常,那么我也是醉了。
    展开全文
  • JVM-程序计数器及其作用

    千次阅读 2020-05-10 22:32:34
    JVM就是通过读取程序计数器的值来决定下一条需要执行的字节码指令,进而进行选择语句、循环、异常处理等; 举例 比如老王正在看片,他看到三十五分钟的时候,突然他的QQ好友苍老师给他开视频,这时候肯定打断他看片...

    概念

    多线程的Java应用程序:为了让每个线程正常工作就提出了程序计数器(Programe Counter Register),每个线程都有自己的程序计数器这样当线程执行切换的时候就可以在上次执行的基础上继续执行,仅仅从一条线程线性执行的角度而言,代码是一条一条的往下执行的,这个时候就是程序计数器;JVM就是通过读取程序计数器的值来决定下一条需要执行的字节码指令,进而进行选择语句、循环、异常处理等;

    举例

    比如老王正在看片,他看到三十五分钟的时候,突然他的QQ好友苍老师给他开视频,这时候肯定打断他看片了,假设苍老师和他视频完了,他肯定要接着他那35分钟的进度去继续看,这时候他怎么知道我看到35分钟了?这时候程序计数器就起了作用,他负责管理进度。

    特点

    • 线程私有
    • JVM规范中唯一没有规定OutOfMemoryError情况的区域
    • 如果正在执行的是Native 方法,则这个计数器值为空

    首先,为什么是线程私有?
    Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现,也就是说,在同一时刻一个处理器内核只会执行一条线程,处理器切换线程时并不会记录上一个线程执行到哪个位置,所以为了线程切换后依然能恢复到原位,每条线程都需要有各自独立的程序计数器。

    为什么没有规定OutOfMemoryError?
    如上文,程序计数器存储的是字节码文件的行号,而这个范围是可知晓的,在一开始分配内存时就可以分配一个绝对不会溢出的内存。

    为什么执行Native方法,值为空?
    Native方法大多是通过C实现并未编译成需要执行的字节码指令,也就不需要去存储字节码文件的行号了。

    摘要连接

    展开全文
  • 首先我们来看程序计数器(PC Register),再了解程序计数器的作用之前,我们先分析下面的代码。 很明显图中右侧是Java源代码,Java源代码是不能直接执行运行的,需要经过编译,即编译成左侧的二进制字节码,主要...

    JVM内存结构组成部分包括程序计数器、虚拟机栈、本地方法栈、堆、方法区。

    首先我们来看程序计数器(PC Register),在了解程序计数器的作用之前,我们先分析下面的代码。

    很明显图中右侧是Java源代码,Java源代码是不能直接执行运行的,需要经过编译,即编译成左侧的二进制字节码,主要是JVM指令,正是因为这些JVM指令在不同的操作系统上都是一致的,所以Java才能够平台。

    有了JVM指令之后,是不能够直接交给CPU来执行的,必须经过一个解释器将每一个JVM指令解析成机器码,然后机器码才可以直接交给CPU执行。

    程序计数器就是在上述步骤中记住每一个JVM指令的下一条指令的执行地址。例如上图中,当CPU执行的getstatic #20同时,程序计数器会将下条指令astore_1的地址存储下来,当getstatic #20执行完成之后,解释器就直接从程序计数器中取astore_1的地址并进行解释然后交个CPU执行,CPU执行的时候程序计数器又会重新把aload_1的地址存储下来,依次循环。

    如果没有程序计数器,就不知道接下来应该执行的是哪一条命令。

    实现程序计数器是通过寄存器来实现的,寄存器是CPU中读取速度最快的单元,因为读取指令地址的操作是非常频繁的,所以在Java虚拟机在设计的时候就把CPU中的寄存器当做了程序计数器,用它来存储地址。

    对于程序计数器有两个特点:线程私有的。

    我们都知道Java是支持多线程的,在多个线程运行的时候,CPU会有一个调度器组件给不同的线程分配时间片,比如给线程1分配一个时间片,如果在时间片里线程1对应的没有执行完成,会对其进行一个暂存,然后交给线程2执行,当线程2执行完或者时间片用完,又切换到线程1继续执行线程1剩余的代码,如果在线程的切换过程中,要记住下一条指令的地址,还是会用到程序计数器。程序计数器跟线程一样也是私有的,属于线程的,不同的线程有对应的程序计数器。

    Java虚拟机规范中规定了程序计数器中不会存在内存溢出,并不像本地方法栈、堆、方法区会有内存溢出。因此JVM的各个厂商在对JVM实现的时候不用去考虑内存溢出。

    展开全文
  • 需要注意是,如果执行是 native 方法,那么程序计数器记录是 undefined 地址,只有执行Java 代码时程序计数器记录才是下一条指令地址。 所以,程序计数器私有主要是为了线程切换后能恢复到正确执行...
  • 程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转...
  • ①. 类加载(掌握) ...类加载指是将类.class文件中二进制数据读取到内存中,存放在运行时数据区方法区中,并创建一个大的Java.lang.Class对象,用来封装方法区内数据结构 ③. 链接(Li
  • 这里,并非是广义上所指物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要误会。JVM中PC寄存器是对物理PC 寄存器一种抽象模拟。 作用 PC寄存器...
  • 这里,并非是广义上所指物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要误会。JVM中PC寄存器是对物理PC寄存器一种抽象模拟; 作用? PC寄存器...
  •  作用:字节码解释其工作时,通过这个计数器的值的改变,来选取下一条执行的字节码命令.  由于java虚拟机的都线程是通过线程轮流切换,并分配执行时间的方式 实现的. 故在任意确定时刻,一个处理器 转载于:...
  • 1. 程序计数器 程序计数器是一块较小内存空间,可以看作是当前线程所执行字节码行号...程序计数器主要两个作用 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码流程控制。 如:顺序执行、
  • 程序计数器

    千次阅读 2019-03-29 13:46:29
    程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现)1.字节码解释器工作时就是通过改变这...
  • 程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转...
  • 前言 在上篇文章中,我们了解到 JVM 运行时数据区有五个区域,分别是:程序...程序计数器(Program Counter Register)区域是所有 Java 运行时数据区中最小的一块,它是一块很小的内存空间,它的作用可以看作是当前
  • 1、前篇介绍了【JAVA虚拟机堆内存结构以及堆内存作用对象回收机制】,主要包含四部分 一、堆区(Heap) 二、对象内存布局 三、对象访问定位 四、Java内存划分 2、前篇博文已将对JVM虚拟机内存中 ...
  • jvm程序计数器

    2018-10-26 09:45:01
    程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转...
  • JVM-程序计数器

    2019-11-05 19:57:53
    程序计数器的作用是记录执行的字节码的位置,说白了就是代码执行到哪里了。 有什么用呢?这就得说代码在执行时,处理器一次在某一个时刻只能执行一个线程中的一行代码,所以其他线程代码的执行就会暂时停止,等到...
  • JVM 程序计数器

    万次阅读 多人点赞 2018-01-02 17:13:10
    程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转...
  • 程序计数器+栈

    2020-07-18 15:57:45
    程序计数器的作用:记住下一条jvm指令的执行地址; 程序计数器的特点:是线程私有的;不会存在内存溢出; 栈 一个栈是由多个栈帧组成的,栈的特点是先进后出; 定义:Java Virtual Machine Stacks(Java...
  • 文章目录程序计数器作用存储数据异常Java虚拟机栈栈帧局部变量表存储内容存储容量其他操作数栈作用存储内容存储容量动态连接方法返回附加信息栈异常本地方法栈本地方法介绍什么是本地方法为什么要使用本地方法JVM...
  • 0031-程序计数器

    千次阅读 2020-06-03 16:02:33
    程序计数器会存储当前正在执行java方法jvm指令地址,如果是native方法,则是未指定值(undefined) 4. 它是唯一一个在java虚拟机中没有规定任何OutOfMemoryError情况 2 作用 程序计数器会存储当前正在执行java...
  • 3. 程序计数器

    2020-07-15 11:28:40
    一、运行时数据区概述 ​ 运行时数据区分为:程序计数器、JVM 栈...​ 程序计数器是一块较小内存空间,用来保存下一条指令地址,它可以看作是当前线程所执行字节码行号指示器。 2.2 作用Java 线程会映射到
  • jvm指令计数器的作用

    千次阅读 2016-08-03 15:30:52
    因此,为了线程切换后能恢复到正确执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”内存。  如果线程正在执行是一个Java方法...
  • 程序计数器 含义: 程序计数器是一个很小的线程私有内存 作用: 当前线程所执行的字节码的行号指示器 字节码解释器通过改变计数器的值来选取下一条需要执行的字节码指令 当线程执行一个java方法 记录的是虚拟机字节码...
  • 四、程序计数器

    2021-02-02 23:29:12
    程序计数器会存储当前线程正在执行的Java方法的JVM指令地址。 不会出现 OOM 异常。 PC寄存器用来存储指向下一条指令的地址,执行引擎会从寄存器中取到指令并执行。 面试题 PC寄存器存储字节码指令地址的作用是因为...
  • 第四章 程序计数器

    2020-12-20 23:49:35
    4.1PC Register介绍 JVM中PC寄存器是对物理PC寄存器一种抽象模拟 作用:PC寄存器用来存储指向下一条指令地址,也即将要...程序计数器会存储当前线程正在执行的Java方法JVM指令地址:或者,如果是在执行nativ
  • Java虚拟机,java程序的运行环境。 Java语言可移植性正是建立在Java虚拟机基础上。任何平台只要装有针对于该平台Java虚拟机,字节码文件(.class)就可以在该平台上运行。 优点: 一次编译,到处运行 自动内存...
  • JVM程序计数器作用:就是寄存下一次执行指令地址,然后给解析器解析到机器码最后到CPU上执行,如下: 程序计数器特点: (1)是线程私有(每一个线程都有自己的程序计数器) (2)不会存在内存溢出(程序计数器...
  • JVM学习笔记(一)程序计数器

    千次阅读 2018-12-01 15:22:37
    程序计数器正是起到这种作用,所以通常又称为指令计数器。 接着,在书上介绍是: 1.程序计数器是一块较小内存空间,它可以看作是当前线程所执行字节码行号指示器。在虚拟机概念模型里,字节码解释器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,417
精华内容 566
关键字:

java程序计数器的作用

java 订阅