JVM运行时数据区 - 程序计数器

运行时数据区

Java虚拟机在执行Java程序的过程中,会把它管理的内存划分成若干个不同的区域,这些区域有各自的用途、创建及销毁时间,有些区域随着虚拟机的启动一直存在,有些区域则随着用户线程的启动和结束而建立和销毁,这些共同组成了Java虚拟机的运行时数据区域。
在这里插入图片描述
如上图,运行时数据区由方法区、堆区、Java虚拟机栈、本地方法栈、程序计数器五部分组成,其中方法区和堆区是线程共享的区域,Java虚拟机栈、本地方法栈和程序计数器是线程私有的区域,所以后三种的生命周期随着线程消亡而结束,前两种伴随虚拟机的启动一直存在。

程序计数器

程序计数器(也称PC寄存器)是线程私有地一块很小的内存区域,几乎忽略不计,同时也是运行速度最快的存储区域,存储了要执行的下一条指令的地址。

作用:

1、保证CPU的处理器切换线程执行时,等待的线程恢复执行之后能回到正确的位置继续执行(CPU的处理器在任一时间只能执行一个线程的指令,并且会不断切换线程执行)。

2、程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器完成。

特性:

1、唯一一个在Java虛拟机规范中没有规定任何OutotMemoryError情况的区域

2、对于Java方法,则会存储线程要执行的当前Java方法JVM的指令地址,对于native方法,则未指定值(undefined)。
在这里插入图片描述

如图,Java方法编译之后会生成JVM字节码指令,字节码指令并不能被CPU直接执行,需要通过字节码执行引擎解释成机器码执行,字节码执行引擎通过程序计数器中存储指令地址,找到对应的字节码指令,如果执行引擎中正在执行0对应的指令,程序计数器中则记录的下一条指令的地址就是3,紧接着就是4,5,6,如此推进。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 10:12:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 10:12:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 10:12:03       82 阅读
  4. Python语言-面向对象

    2024-06-06 10:12:03       91 阅读

热门阅读

  1. 网络安全实战基础——实战工具与攻防环境介绍

    2024-06-06 10:12:03       34 阅读
  2. linux服务器配置openssl

    2024-06-06 10:12:03       29 阅读
  3. 面向小白的 Spark MLlib 入门教学

    2024-06-06 10:12:03       29 阅读
  4. make 中 DESTDIR 和 --prefix 的区别

    2024-06-06 10:12:03       29 阅读
  5. Web前端三大主流框架深度解析:React, Angular, Vue.js

    2024-06-06 10:12:03       26 阅读
  6. 探索SQL:从基础到高级的全面入门教程

    2024-06-06 10:12:03       32 阅读