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++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...
随机推荐
- 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...
- 吾八哥学Selenium(二):操作输入框/按钮的方法
一个web页面一定少不了输入框或者按钮这两种元素,那么在Python里如何使用Selenium操作web页面里的输入框和按钮呢?本文带你简单入门. 本文采用了一个例子,就是利用Selenium打开百度 ...
- chrome浏览器Timing内各字段解析
Queueing请求文件顺序的的排序 Stalled是浏览器得到要发出这个请求的指令到请求可以发出的等待时间,一般是代理协商.以及等待可复用的TCP连接释放的时间,不包括DNS查询.建立TCP连接 ...
- dojo之FilteringSelect
1.保证可视框宽度与下拉框宽度一致 forceWidth:'true' 2.控制下拉框的高度 maxHeight:'120'
- HighCharts之2D堆面积图
HighCharts之2D堆面积图 1.HighCharts之2D堆面积图源码 StackedArea.html: <!DOCTYPE html> <html> <hea ...
- 部署Java Web项目报错(二)
在编写HighCharts折线时,并且数据源是请求CSV,运行项目时出现错误 Uncaught TypeError: Cannot read property 'prototype' of undef ...
- Unhandled event loop exception Java heap space
1 错误描述 2 错误原因 3 解决办法
- Java获取某年某季度的第一天出错
1.错误描述 Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given ...
- Caused by: java.net.SocketException: Software caused connection abort: socket write error
1.错误描述 [ERROR:]2015-05-06 10:54:18,967 [异常拦截] ClientAbortException: java.net.SocketException: Softwa ...
- JSON对象转换成JSON字符串
1.问题背景 有一个json对象,需要将其转换成json字符串 JSON.stringify(obj) 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DT ...