什么是程序计数器?

程序计数器是一块 较小 的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 ;在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时,就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳准、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 ;

简单的理解为,是程序计数器保证了程序的正常执行 ;

有什么特点

线程私有的

是java虚拟机规范里面,唯一 一个 没有规定任何 OutOfMemoryError 情况的区域

生命周期随着线程,线程启动而产生,线程结束而消亡

为什么具有这些特点

这里重点理解 :程序计数器,可以看做是当前线程执行的字节码的 行号指示器 ,这句话;要理解这句话,需要先知道字节码文件长什么样子,看下面的代码

// java 文件被翻译为字节码的时候,字节码大概类似于下面的样子

public void haha(){

// 原来的 haha 方法内部的 java 代码,被翻译为下面的类似于汇编语言的指令

0 xxxx ....

2 xxxx ....

4 xx ...

5 xxx ...

}

上面左边的 0、2、4、5 ,就是类似于字节码的行号(实际是指令的偏移地址),程序计数器中保存中的值,就是它们;字节码解释器,就是根据它们,来执行程序的 ;

理解了程序计数器,就好理解它的这些特点了;

我们都知道,java是支持多线程的,当CPU执行权从 A 线程,转移到 B 线程的时候,JVM就要暂时挂起线程 A ,去执行线程 B ;当线程 A 再次得到CPU执行权的时候,又会挂起B线程,继续执行 A 线程 ;

我们想象下,CPU是怎么知道记住之前A线程,执行到哪一处的?

答案是,CPU根本就不会记住之前执行到哪里了,它只是埋头苦干;那是什么保证了切换线程的程序可以正常执行的;答案是 : 程序计数器 ;程序计数器里面保存的是 当前线程执行的字节码的行号(看着像行号,其实是指令地址);

那么,我们需要几个程序计数器呢?如果,我们只有一个的话,切换B线程以后,程序计数器里面保存的就是B线程所执行的字节码的行号了,再切换回A线程,就蒙圈了,不知道执行到哪里了,因为,程序计数器里面保存的是B线程当前执行的字节码地址 ;因此,我们可以想象出,要为每个线程都分配一个程序计数器,因此,程序计数器的内存空间是线程私有的;这样即使线程 A 被挂起,但是线程 A 里面的程序计数器,记住了A线程当前执行到的字节码的指令地址了 ,等再次切回到A线程的时候,看一下程序计数器,就知道之前执行到哪里了!

那么程序计数器,什么时候分配内存呢?我们试想下,一个线程在执行的任何期间,都会失去CPU执行权,因此,我们要从一个线程被创建开始执行,就要无时无刻的记录着该线程当前执行到哪里了!因此,线程计数器,必须是线程被创建开始执行的时候,就要一同被创建;

程序计数器,保存的是当前执行的字节码的偏移地址(也就是之前说的行号,其实那不是行号,是指令的偏移地址,只是为了好理解,才说是行号的,),当执行到下一条指令的时候,改变的只是程序计数器中保存的地址,并不需要申请新的内存来保存新的指令地址;因此,永远都不可能内存溢出的;因此,jvm虚拟机规范,也就没有规定,也是唯一一个没有规定 OutOfMemoryError 异常 的区域;;

当线程执行的是本地方法的时候,程序计数器中保存的值是空(undefined);原因很简单:本地方法是C++/C 写的,由系统调用,根本不会产生字节码文件,因此,程序计数器也就不会做任何记录 ;

转自:https://blog.csdn.net/youngyouth/article/details/79868299

java pc计数器_java虚拟机-程序计数器PC Register相关推荐

  1. 用java的io做一个代码计数器,如何制作Java页面计数器_java

    大庆采油六厂采油工艺研究所 王兵 王波 常常逛WWW的人,一定对许多起始页上的计数器感兴趣.每当你光临某个站点的起始页时,它的计数器就很亲切地告诉你,从某年某月某日开始,你是第几位光临的人.你可能也想 ...

  2. java帧结构_Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)...

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  3. java 并发计数器_Java 8 LongAdders:管理并发计数器的正确方法

    java 并发计数器 我只是买了新玩具,而Java 8有很多 . 这次我想谈谈我的最爱之一-并发加法器. 这是一组新的类,用于管理由多个线程编写和读取的计数器. 新的API有望显着提高性能,同时仍使事 ...

  4. java 网站计数器_Java页面计数器

    ---- 常常逛WWW的人,一定对许多起始页上的计数器感兴趣.每当你光临某个站点的起始页时,它的计数器就很亲切地告诉你,从某年某月某日开始,你是第几位光临的人.你可能也想在自己的HomePage内做计 ...

  5. java虚拟机-程序计数器PC Register

    什么是程序计数器? 程序计数器是一块 较小 的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 :在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解 ...

  6. java tostring方法_Java虚拟机如执行方法调用的(二)?

    虚方法调用 Java里所有非私有实例方法调用都会被编译成invokevirtual指令. 接口方法调用都会被编译成invokeinterface指令.这两种指令都属于Java虚方法的调用. 在大多数情 ...

  7. java 网站计数器_Java Bean实现网页来访计数器

    1.JSP页: Document   : index Created on : 2009-10-10, 14:47:46 Author     : lucifer --%> /p> &qu ...

  8. java直接引用_Java虚拟机 - 符号引用和直接引用理解

    我了解了调用函数时符号引用如何转换为直接引用的,但是对于类变量,实例变量的解析方法还是不太清楚. 符号引用是只包含语义信息,不涉及具体实现的:而解析(resolve)过后的直接引用则是与具体实现息息相 ...

  9. java内存 海子_Java虚拟机:JVM内存模型和volatile详解

    JVM内存模型和volatile详解 Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU内 ...

最新文章

  1. app:compileDebugJavaWithJavac
  2. php向指定文件发送消息,PHP-将文件发送给用户
  3. [美文欣赏]清华胡宇迪教授谈
  4. 【转】 指针函数与函数指针的区别
  5. Java虚拟机运行时的数据区域
  6. javaI/O之PushbackInputStream
  7. 使用Payara Micro的Easy Java EE Microservices
  8. springboot怎么杀进程_线上服务平均响应时间太长,怎么排查?
  9. class(一)--类的创建
  10. 一步一步写算法(之克鲁斯卡尔算法 上)
  11. Nginx反向代理服务器获取不到端口的问题的解决办法
  12. python查看服务器日志_python读取服务器日志的方法
  13. 晨风机器人回复词库_晨风qq机器人词库下载2015 最新完整版
  14. python爬取全球历年GDP数据
  15. 获取 IE 浏览器版本以及判断是否开启 cookie
  16. HTML5分级标题,最佳HTML5结构,其中标题/标题是文章标签外
  17. Android对抗反编译,非科班程序员求职经历分享
  18. 计算机内存错误 要降频,windows10系统出现内存自动降频的解决方法
  19. C++ 图书管理系统设计
  20. 计算机原理实验红绿灯转换,微机原理实验交通灯控制实验.doc

热门文章

  1. 我为什么选择Angular 2?
  2. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
  3. Asp.net MVC 中Controller返回值类型ActionResult
  4. Android Studio之Instant Run requires ‘Tools | Android | Enable ADB integration‘ to be enabled解决办法
  5. LeetCode之Single Number
  6. Android插件化开发之运行未安装apk的activity
  7. Android之用jadx进行反编译
  8. Hibernate 持久化状态、HQL语句大全(转)
  9. 公司重金求数据分析师:为什么90%的公司都需要它?
  10. 为什么软件工程师找不到工作?我想分享四个“恐怖故事”