深入理解JVM--(1)运行时的数据区域划分-程序计数器

  最近在学习jvm,准备在园子里写个系列笔记,有什么问题大家可以一起探讨。今天学习数据区域划分的第一部分--程序计数器。   JVM在运行时会把管理的内存划分为不同的数据区域,有的区域随着jvm进程启动就开始存在,有的生命周期则与用户线程的周期相同。下面我们来看个划分图(摘自网络)

其中,方法区、java堆、执行引擎、本地库接口是线程共享的,虚拟机栈、本地方法栈、程序计数器是私有的。

  接下来,我们介绍第一个概念:程序计数器。

      首先看一下百度百科的解释:

程序计数器是用于存放下一条指令所在单元的地址的地方。

   程序计数器是计算机处理器中的寄存器,它包含当前正在执行的指令的地址(位置)。当每个指令被获取,程序计数器的存储地址加一。在每个指令被获取之后,程序计数器指向顺序中的下一个指令。当计算机重启或复位时,程序计数器通常恢复到 零。

  当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析指令,执行指令。完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。

  程序计数器其实就是一小块内存区域,可以看作是当前线程所执行的字节码的行号代码,直白一点说,就是当前线程执行到哪一行的一个代码计数器。

  大家都知道在jvm中,是跑多线程的,包括我们的debug,都是在多线程中运行。java中的多线程是通过轮流切换分配处理器来执行的,在任何时间,一个处理器只处理一条指令,所以一旦切换线程,就依靠程序计数器来确定执行到了哪一行代码,或者说是哪一行指令,所以,程序计数器是私有的,才能保证各个线程间的任务执行互不影响。

  还有一点要注意的是,如果线程运行的是一个java的方法,程序计数器记录的是虚拟机字节码指令的地址(在jvm启动后,编译java文件成字节码文件),而如果是一个Native方法,程序计数器则为空,这里也是java虚拟机规范中,唯一一个没有规定OutOfMemoryError的区域。

The Java Virtual Machine can support many threads of execution at once (JLS §17). Each Java Virtual Machine thread has its own pc (program counter) register. At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method (§2.6) for that thread. If that method is not native, the pc register contains the address of the Java Virtual Machine instruction currently being executed. If the method currently being executed by the thread is native, the value of the Java Virtual Machine's pc register is undefined. The Java Virtual Machine's pc register is wide enough to hold a returnAddress or a native pointer on the specific platform.

  因为jvm中的程序计数器,记录的是字节码指令的地址,而本地方法体不一定是有java实现的,所以自然不能支持程序计数器。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博客

菜菜从零学习WCF七(消息协定)

    另一种常见方案是定义消息头和正文的安全属性,也就是说,确定是否对这些元素进行数字签名和加密。消息样式的操作可提供这种控制。

9430
来自专栏mwangblog

python操作文本文件

21840
来自专栏偏前端工程师的驿站

(cljs/run-at (JSVM. :browser) "命名空间就这么简单")

前言  一个cljs文件定义一个命名空间,通过命名空间可以有效组织代码,这是构建大型系统必备的基础设施。本篇我们就深入理解cljs中的命名空间吧! 好习惯从"头...

21650
来自专栏python学习路

二、路由、模板

一、路由系统 在settings.py文件中通过ROOT_URLCONF指定根级url的配置 urlpatterns是一个url()实例的列表 一个url()对...

34580
来自专栏大内老A

[WCF安全系列]绑定、安全模式与客户端凭证类型:WSHttpBinding与WSDualHttpBinding

在上一篇文章中,我们详细地介绍了BasicHttpBinding具有怎样的安全模式的支持,已经在各种安全模式下分别可以采用怎样的客户端凭证。接下来我们来进一步分...

20670
来自专栏GreenLeaves

SqlHelper中SqlHelperParameterCache类的用法介绍

SqlHelper类中提供了三种可以用来管理SqlParameter参数的共享方法。下面来一一讲解: 1、CacheParameterSet 将SqlParam...

239100
来自专栏有困难要上,没有困难创造困难也要上!

Python 使用 os.fork() 创建子进程

41860
来自专栏飞雪无情的博客

android技术文档翻译--ant任务

原文地址 http://tools.android.com/tech-docs/ant-tasks

7920
来自专栏python3

python3--基础综合测试

解释:char类型在python中不存在,它是其他编程语言的一种数据类型,比如C/C++,JAVA

15510
来自专栏码洞

Channel最佳实践之基本规则【译】

channel[通道]是golang的一种重要特性,正是因为channel的存在才使得golang不同于其它语言。channel使得并发编程变得简单容易有趣。

7510

扫码关注云+社区

领取腾讯云代金券