Jvm(8),运行时数据---独占区---程序计数器

一,什么是程序计数器。

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

说白了就是代码该执行哪一行比如说下面的代码

程序计数器主要记录的就是行号,该执行哪一行不该执行哪一行的代码比如说5--6--10--11

程序计数器存储的就是这些代码。

以上的红色区域就是存储在程序计数器里面的。

二,程序计数器的特征

2.1,如果线程正在执行的是Java 方法,则这个计数器记录的是正在执行的虚拟机字节码指令地址这个就不用解释了就是上面的能看到的信息。

2.2,程序计数器在方法在线程独享区里面。

这个也好理解,这个也好理解,每个线程都有自己的行号,指示自己该走哪一行了,假如在线程共享区里面的话,两个线程走代码很容易乱的。

线程是CPU 最小的调度单元 ava 虚拟机的多线程是通过切换线程并分配处理器执行时间的方式来实现的,在任何一个确定的时间,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令

如有如下图过程,当A 线程先向处理器发出指令,但当执行到中途一半时,B线程过来执行,且优先级高,此时处理器将A 挂起,B 执行,当B 执行结束需要唤醒A 同时得知道A 的执行位置,就可以查看线程A 中的计数器指令

2.3,如果正在执行的是Native 方法,则这个技术器值为空(Undefined)这个native方法就是电脑硬件实现的方法,这里不用细究就是明白有这回事就行了。

2.4,此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域这个也很好理解,这一块区域是程序员唯一一块不能手动修改的区域,是jvm自动的在生成的而且还是存储的行号东西也不多,所以不会内存溢出的。

2.5,一块较小的内存空间其实想象也就是这回事,存储的东西不多的。而且java语言有些是用到的时候才加载过来的。

原文地址:https://www.cnblogs.com/qingruihappy/p/9691290.html

时间: 2024-10-07 18:28:31

Jvm(8),运行时数据---独占区---程序计数器的相关文章

Jvm(9),运行时数据---独占区---虚拟机栈

一,总览 Java Virtual Machine Stacks,线程私有,生命周期与线程相同,描述的是Java方法执行的内存模型:每一个方法执行的同时都会创建一个栈帧(Stack Frame),由于存储局部变量表.操作数栈.动态链接.方法出口等信息.每一个方法的执行就对应着栈帧在虚拟机栈中的入栈,出栈过程. 我们来看一个例子 public class Demo3 { public void test1() { System.out.println("我是test1的方法"); tes

Jvm(10),运行时数据---独占区---StackOverflowError和OutOfMemoryError区别

1.StackOverflowError 源代码解释说:抛出这个错误是因为递归太深.其实真正的原因是因为Java线程操作是基于栈的,当调用方法内部方法也就是进行一次递归的时候就会把当前方法压入栈直到方法内部的方法执行完全之后,就会返回上一个方法,也就是出栈操作执行上一个方法. public class StackOverflowTest { public static void main(String[] args){ method(); } private static void method

Jvm(11),运行时数据---独占区---本地方法栈

本地方法栈主要是来处理native的方法的,我们来看一下什么是native的方法. Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java 程序的功能. 其实在java中我们通用的虚拟机HotSpot中,本地方法栈和虚拟机栈是同一块区域在这里讲的一般是通用的虚拟机. 原文地址:https://www.cnblogs.com/qingruihappy/p/9691301.html

JVM入门——运行时数据区

这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课.其中的“堆”和“虚拟机栈(栈)”更是耳熟能详.下面将围绕这张图对JVM的运行时数据区做一个简单介绍. 程序计数器(Program Counter Register) 这和计算机操作系统中的程序计数器类似,在计算机操作系统中程序计数器表示这个进程要执行的下个指令的地址,对于JVM中的程序计数器可以看做是当前线程所执行的字节码的行号指示器,每个线程都有一个程序计数器(这很好理解,每个线程都有在执行任务,如果线程切换后要能

jvm的运行时数据区

jvm在java程序运行时会将它所管理的内存划分成不同的区域做不同的功能,这并不难以想象.主要有两类结构,即:堆和栈. java堆主要是保存运行时的对象和数组数据,是所有线程共享的内存区域,在堆中有方法区.运行时常量池.方法区是代码的存储区,类.方法数据.方法的字节码.字段.构造函数等信息都会存储在这里. 运行时常量池是存放类或接口中的方法和数据的常量池,当类或接口被加载的时候就会产生对应的运行时常量池,里面存储了从编译期可知的字面量到运行期才解析出来的方法和字段引用. jvm的线程是通过栈结构

JVM<一>----------运行时数据区域

参考:1.JVM Specification: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5 2.<深入理解Java虚拟机> 刚开始看JVM Specification ,说实话由于专业英语不过关,有些关键词总是看不懂意思,后来参考.<深入理解Java虚拟机>方能感悟到JVM的强大. 我们就先从运行时数据区域开始 一.运行时数据区域分配图 The Java Virtual Machine

JVM学习-运行时数据区

不同于C,C++程序,Java程序的内存管理工作由Java虚拟机(JVM)接管,这减低了java程序员的负担,但如果出现内存泄露与溢出问题如报OutOfMemory,StackOverFlow异常错误时,如果不了解JVM虚拟机的内存管理细节,往往很难快速定位错误. JVM在运行时会把其所管理的内存分为几个不同的数据区域,分别为:程序计数器,虚拟机栈,本地方法栈,堆,方法区等.这些区域存放的数据不同,功能也不同. JVM管理的内存包含以下几个运行时数据区: 1.程序计数器 程序计数器是一块较小的内

jvm(运行时数据区域)

以上是jvm在运行时内存的数据分区图例(各个分区简介): 1.程序计数器:           在jvm中一块很小的区域,主要作用就是记录当前线程执行字节码的行号指示器.           在单核的多线程中,cpu会在不同线程之间切换,为了切换回来时正确的回到当前线程的执行位置,           每个线程都有自己单独的程序计数器,之间互不影响,独立运行,同时这块区域也是在java虚拟机           规范中唯一没有规定任何OutOfMemoryError情况的区域. 2.虚拟机栈:

Jvm(12),运行时数据---共享区---jvm堆空间总览

一,jvm堆总览 这里我们先不展开说,只是从总体上来看一下这个堆内存的情况,我们知道堆内存一般都是存放对象的内存区域,也就是new出来的对象的地方,所以这一块区区域最大的地方,所以这一块也是GC垃圾回收最经常光顾的区域. 至于新生代老年代和伊甸园我们后面再来看,按照教程走. 原文地址:https://www.cnblogs.com/qingruihappy/p/9691305.html