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

    2018-07-28 02:52:00
    JVM程序计数器 VSOS程序计数器 一. 介绍 JVM程序计数器:  程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个...

    今天突然在思考一个问题,jvm内存模型中的PC程序计数器和OS操作系统程序计数器有没有关系,是不是对应的,在网上查了些资料,弄懂了这个问题。

    JVM程序计数器 VS OS程序计数器

    一. 介绍

         JVM程序计数

      程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。- - 摘自《深入理解Java虚拟机》

      OS程序计数器

         为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又称为指令计数器。在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第一条指令的地址。当执行指令时,CPU将自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。 当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的地址,以此实现转移。有些机器中也称PC为指令指针IP(Instruction Pointer)

    二. 特点

      JVM程序计数: 

    1. 如果线程正在执行的是Java 方法,则这个计数器记录的是正在执行的虚拟机字节码指令地址

    2. 如果正在执行的是Native 方法,则这个技术器值为空(Undefined)

    3. 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域

    4. 在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存

      OS程序计数器

    1. PC永远指向下一条待执行指令的内存地址(永远不会为Undefined),并且在程序开始执行前,将程序指令序列的起始地址,即程序的第一条指令所在的内存单元地址送入PC,
    2. CPU按照PC的指示从内存读取第一条指令(取指)。
    3.  当执行指令时,CPU自动地修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数(指令字节数),使PC总是指向下一条将要取指的指令地址。
    4. 由于大多数指令都是按顺序来执行的,所以修改PC的过程通常只是简单的对PC 加“指令字节数”。
    5. 当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的目标地址。
    6. 处理器总是按照PC指向,取指、译码、执行,以此实现了程序转移。 

    三.存储位置

      JVM程序技术器:    

      线程独立的,JVM内存模型一块独立的存储区域,一般是CPU高速缓存中(L1~L3

      OS程序计数器

      OS线程的PC寄存器中。

     

    转载于:https://www.cnblogs.com/zhengwangzw/p/9380487.html

    展开全文
  • jvm程序计数器

    2018-03-29 20:43:58
    jvm程序计数器 原创 2016年10月10日 21:40:34 标签:虚拟机 1239 概念  程序计数器是一块较小的内存空间,他的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念...

    jvm程序计数器

    原创 2016年10月10日 21:40:34

    概念 
    程序计数器是一块较小的内存空间,他的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 
    由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。 
    如果线程正在执行一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器为空(undefined)。此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

    注: 
    1. 通俗解释: 
    对于一个运行中的java程序而言,其中的每一个线程都有他自己的PC(程序计数器)寄存器,他是在该线程启动时创建的,PC寄存器的大小是一个字长,因此它既能够持有一个本地指针,也能持有一个returnAddress(returnAddress类型会被java虚拟机的jsr、ret和jsr_w指令所使用。returnAddress类型的值只想一条虚拟机指令的操作码。与前面介绍的那些数值类的原生类型不同,returnAddress类型在java语言之中并不存在相应的类型,也无法在程序运行期间更改returnAddress类型的值。)。当线程执行某个java方法时 ,PC寄存器的内容总是下一条被执行指令的”地址”,这里的”地址”可以是一个本地指针,也可以是在方法字节码中相对于该方法起始指令的偏移量。如果该线程正在执行一个本地方法,那么PC寄存器的值是”Undefined”。 
    2.本地方法和java方法: 
    java中有两种方法:java方法和本地方法。java方法是有java语言编写,编译成字节码,存储在class文件中的。本地方法是有其它语言(比如C,C++,或者是会变语言)编写的,编译成和处理器相关的机器代码。本地方法保存在动态连接库中,格式是各个平台专用的。java方法是与平台无关的,但是在本地方法却不是。运行中的java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。

     
    u014745069
    • u014745069

      2017-09-23 10:56#1楼
    • 讲的通俗易懂,并且很受用!谢谢!
    展开全文
  • JVM 程序计数器

    2020-10-26 16:56:57
    程序计数器(PC寄存器) 介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。 这里,并非是广义上所...

    程序计数器(PC寄存器)

    介绍

    JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。

    这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。

    在这里插入图片描述

    • 程序计数器是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。它可以被当作是当前线程执行的字节码的行号指示器。
    • 在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
    • 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的java方法的JVM指令地址;或者,如果是在执行native方法,则是未指定值(undefined)
    • 程序计数器是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
    • 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
    • 它是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

    作用

    PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。
    在这里插入图片描述

    示例

    public class PCRegisterTest {
    
        public static void main(String[] args) {
            int i = 10;
            int j = 20;
            int k = i + j;
            String s = "abc";
            System.out.println(i);
            System.out.println(k);
        }
    }
    

    将class文件反编译成字节码

      public static void main(java.lang.String[]);
        descriptor: ([Ljava/lang/String;)V
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=2, locals=5, args_size=1
             0: bipush        10
             2: istore_1
             3: bipush        20
             5: istore_2
             6: iload_1
             7: iload_2
             8: iadd
             9: istore_3
            10: ldc           #2                  // String abc
            12: astore        4
            14: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
            17: iload_1
            18: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
            21: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
            24: iload_3
            25: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
            28: return
    

    通过程序计数器可以知道当前方法运行到哪一步

    在这里插入图片描述

    相关问题

    使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?

    因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。

    JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。

    在这里插入图片描述

    PC寄存器为什么被设定为私有的?

    我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。

    由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器中的一个内核,只会执行某个线程中的一条指令。

    这样必然导致经常中断或恢复,如何保证分毫无差呢?每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响。

    在这里插入图片描述

    CPU时间片

    CPU时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。

    在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。

    但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。

    如果某个作业在时间片结束之前,整个任务还没有完成,那么该作业就被暂停下来,放弃CPU,等待下一轮循环再继续做.此时CPU又分配给另一个作业去使用.由于计算机的处理速度很快,只要时间片的间隔取得适当,那么一个用户作业从用完分配给它的一个时间片到获得下一个CPU时间片,中间有所"停顿";但用户察觉不出来,好像整个系统全由它"独占"似的。

    在这里插入图片描述

    为什么没有规定OutOfMemoryError?

    程序计数器存储的是字节码文件的行号,而这个范围是可知晓的,在一开始分配内存时就可以分配一个绝对不会溢出的内存。

    为什么执行Native方法,值为空?

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

    展开全文
  • Jvm程序计数器

    2019-10-24 12:40:21
    (1)计数指的是存储的是下一条jvm指令的执行内存地址,如下图所示,左侧的数字序号. 2.特点: (1)线程私有的 (2)不会存在内存溢出(对比虚拟机栈和堆,方法去溢出) 3.是什么?有什么组成?有什么作用?存在的注意问题,...

    1.作用:
    (1)计数指的是存储的是下一条jvm指令的执行内存地址,如下图所示,左侧的数字序号. 

    2.特点:

    (1)线程私有的

    (2)不会存在内存溢出(对比虚拟机栈和堆,方法去溢出)

    3.是什么?有什么组成?有什么作用?存在的注意问题,线程安全和垃圾回收

    展开全文
  • JVM程序计数器(PC寄存器)

    千次阅读 2020-09-19 10:25:49
    JVM程序计数器(PC寄存器) pc Register介绍 JVM中的程序计数寄存器(Program counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。 这里,...
  • java—jvm程序计数器

    2019-05-12 11:52:44
    一、概念 多线程的Java应用程序:为了让每个线程正常工作就提出了程序计数器(Programe Counter Register),每...JVM就是通过读取程序计数器的值来决定下一条需要执行的字节码指令,进而进行选择语句、循环、异常处...
  • JVM程序计数器 (二)

    2020-09-21 20:57:03
    程序计数器英文层Program Counter Register, 它的作用是记住下一条JVM执行指令 当一段成程序执行的时候,会先编译成二进制的字节码, jvm 指令通过解释器解释成机器码,于此同时它也会将下一次执行的jvm 指令位置交给...
  • 概述 PC寄存器(程序计数器)用来存储指向下一条字节码...任何时间一个线程只能有一个方法在执行,也就是所谓的当前方法,程序计数器会存储当前线程正在执行的Java方法的JVM指令地址,如果正在执行的方法为native方法,
  • 6. JVM程序计数器

    2020-09-12 16:23:15
    它是一块很小的内存空间,几乎可以忽略不记。...它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。字节码解释器工作时就是通过改变这个计数器
  • JVM 程序计数器的理解

    2020-08-02 00:29:21
    JVM 中的程序计数寄存器(Program Counter Register) ,Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的现场信息。 CPU 只有把数据装栽到寄存器才能够运行。 它是唯一一个在 Java虚拟机规范中没有规定任何 ...
  • 这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟; 作用? PC寄存器...
  • 程序计数器 它记录了程序执行字节码的行号和指令,字节码解释器的工作就是改变程序计数器的值,切换下一条需要执行的指令(分支,循环,跳转,异常等)。java虚拟机是多线程通过轮流切换CPU时间片的方式实现,在同一时间...
  • 程序计数器它记录了程序执行字节码的行号和指令,字节码解释器的工作就是改变程序计数器的值,切换下一条需要执行的指令(分支,循环,跳转,异常等)。java虚拟机是多线程通过轮流切换CPU时间片的方式实现,在同一时间内...
  • 程序计数器它记录了程序执行字节码的行号和指令,字节码解释器的工作就是改变程序计数器的值,切换下一条需要执行的指令(分支,循环,跳转,异常等)。java虚拟机是多线程通过轮流切换CPU时间片的方式实现,在同一时间内...
  • JVM程序计数器

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,376
精华内容 4,150
关键字:

jvm程序计数器