Java内存区域之程序计数器--《深入理解Java虚拟机》学习笔记及个人理解(一)
Java虚拟机程序计数器
在书上的P39页
程序计数器干嘛的?
有了它,字节码解释器才可以知道下一条要执行的字节码指令是哪个。
无论是取下一条指令还是分支、循环、跳转、中断、线程恢复,都需要这个程序计数器。
程序计数器存在哪?
虚拟机区别于硬件,组成原理里学的程序计数器是用CS和IP寄存器来存,来表示指令地址。
而Java把程序计数器存在内存里。
我好像在操作系统中也听说过程序计数器?
是跟操作系统中的程序计数器有点类似。
在一个时刻,一个处理器只会执行一条线程,HotSpot中使用原生线程模型,OS线程和Java线程1:1映射。
操作系统中,当多个线程轮流切换着执行的时候,每个线程都需要记录自己被中断的位置,以方便恢复线程后能够继续接着执行。
参考操作系统中的线程控制块(TCB),当线程切换时要保存上下文状态,其中就包括指令计数器PC,线程被中断后再切换回来时就知道了从哪里开始继续执行。
Java中也一样,当有多个线程执行时,也是线程间进行轮转,当线程切换回来的时候就需要程序计数器来为该线程指明从哪里开始执行。
所以也就很好理解,Java的程序计数器是‘线程私有的’,每个线程都要有一个。
我听说程序计数器还可以为空?
Java在执行Native方法时,不是Java在工作,而是调用了操作系统中的方法,所以此时不需要Java的程序计数器,此时为空。
既然程序计数器此时为空,Native方法执行完了以后,该回到哪里呢?
我之前也对这个有疑问,就去查了查Java栈帧有关的知识...我是没查到什么。
就去看了c语言的一个栈帧教程,结合着汇编代码:http://ms.csdn.net/geek/187200
如果不想看,我就简单介绍一下:
汇编是这样做的:当一个方法调用一个方法时,用栈来保存上下文(调用一个函数前先push,最后方法结束时再pop出来),既然保存了上下文,就可以先保存调用者的pc指针,然后执行完方法后,再把pc还原,就可以回到上一层方法了。
Java每个方法执行的时候,都会在Java虚拟机栈创建一个栈帧。一个方法对应一个栈帧。Java控制不了寄存器,但是应该可以用内部堆栈来保存这个上下文,当方法执行完后,调整PC指针,让PC指向方法调用指令后面的一条指令。
JVMS7中的2.6.4 Normal Method Invocation Completion(方法正常调用完成)中写道:
The current frame (§2.6) is used in this case to restore the state of the invoker, including its local variables and operand stack, with the program counter of the invoker appropriately incremented to skip past the method invocation instruction. Execution then continues normally in the invoking method's frame with the returned value (if any) pushed onto the operand stack of that frame.
手动翻译:在这种情况,当前栈桢就被用来恢复调用者的状态,都恢复哪些呢?恢复局部变量表、操作数栈 和 程序计数器(pc指针),而这个程序计数器要适当地增加,来指向下一条指令(也就是调用函数的下一句)。使调用者方法能够正常地继续执行下去,而且返回值push到了调用方法的操作数栈中。
Native方法也是方法,当他被调用了后,会进入本地方法栈。有的虚拟机会把虚拟机栈和本地方法栈合为一个。当Native方法在本地方法栈里执行完时,也会根据类似的机制让PC重新指向调用指令后面的一条指令。
这个博客里的本地方法栈的图很形象:https://www.cnblogs.com/wade-luffy/p/5813747.html。
Java内存区域之程序计数器--《深入理解Java虚拟机》学习笔记及个人理解(一)的更多相关文章
- java内存区域之程序计数器
程序计数器(program counter register) 作用:字节码解释其工作时,通过这个计数器的值的改变,来选取下一条执行的字节码命令. 由于java虚拟机的都线程是通过线程轮流切换,并分配 ...
- Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一
Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...
- 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域
一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...
- Java内存区域划分和GC机制
Java 内存区域和GC机制 目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Ga ...
- JVM Java 内存区域透彻分析(转)
出处: Java 内存区域透彻分析 Java8内存模型—永久代(PermGen)和元空间(Metaspace) 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这 ...
- 《深入理解Java虚拟机》Java内存区域与内存溢出异常
注:“蓝色加粗字体”为书本原语 先来一张JVM运行时数据区域图,再接下来一一分析各区域功能: 程序计数器 程序计数器(program Counter Register)是一块较小的内存空间,它可以 ...
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
- 深入理解java虚拟机之java内存区域
java虚拟机在执行java程序的时候会把它所管理的内存分为多个不同的区域,每个区域都有不同的作用,以及由各自的生命周期,有些随着虚拟机进行的启动而存在,有些区域则依赖于用户线程的启动或结束而建立或销 ...
- 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常
2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...
随机推荐
- react-dom.js 源码
/** *以下这是 react-dom.js 的源代码 * ReactDOM v15.3.1 * * Copyright 2013-present, Facebook, Inc. * All righ ...
- 记录一下html渲染页面的 js框架
1.artTemplate 2.laytpl 3.juicer 4.doT 5.Mustache 6.Handlebars 7.baiduTemplate 8.KissyTemplate 详细的以后补 ...
- 【前端】jQuery移动端左滑删除
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/left_slide_menu.html <!doctype html> <html> &l ...
- RS232 3线制与7线制的区别
当通信距离较近时,可不需要Modem,通信双方可以直接连接,这种情况下,只需使用少数几根信号线.最简单的情况,在通信中根本不需要RS-232C的控制联络信号,只需三根线(发送线.接收线.信号地线)便可 ...
- SOCKET 编程TCP/IP、UDP
TCP/IP 资源:http://download.csdn.net/detail/mao0514/9061265 server: #include<stdio.h> #include&l ...
- zTree实现更新根节点中第i个节点的名称
zTree实现更新根节点中第i个节点的名称 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树 ...
- (二十八)monggodb和maven零散笔记
(1)maven导包的问题:当在pom.xml界面的Dependencies中点击add之后输入jar包查询条件后,如果确定条件没有输错,repo中也确实存在相关jar包,而并没有查处任何结果时,可以 ...
- (八)java垃圾回收和收尾
垃圾回收机制:当一个对象不再被引用时,或者说当一个对象的引用不存在时,我们就认为该对象不再被需要,它所占用的内存就会被释放掉. 垃圾回收只是在程序执行过程中偶尔发生,java不同的运行时刻会产 ...
- JSP自定义标签配置
JSP自定义标签配置 JSP自定义标签 <taglib> <taglib-uri>/WEB-INF/you.tld</taglib-uri> ...
- Axure RP一个专业的快速原型设计工具
Axure RP是一个专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写. Axure简要介绍 Axur ...