运行时数据区及程序计数器

概述

1、内存

(1)硬盘和CPU的中间仓库及桥梁

(2)承载 OS 和应用程序的实时运行 JVM 内存布局规定 Java 在运行过程中内存申请、分配、管理的策略

(3)保证 JVM 高效稳定运行

(4)不同 JVM 对于内存的划分方式和管理机制存在着部分差异

2、JVM 定义若干种程序运行期间,会使用到运行时数据区

(1)一些会随着虚拟机启动而创建,随着虚拟机退出而销毁

(2)一些则是与线程一一对应,随着线程开始和结束而创建和销毁

3、与线程对应的数据区域

(1)每个线程独立:程序计数器、栈、本地栈

(2)线程间共享:堆、堆外内存(永久代或元空间、代码缓存)

4、每个 JVM 只有一个 Runtime 实例,即为运行时环境

 

线程

1、线程是一个程序里的运行单元

2、JVM 允许一个应用有多个线程并行的执行,在 Hotspot JVM 中,每个线程都与操作系统的本地线程直接映射

3、当一个 Java 线程准备执行后,此时一个操作系统的本地线程也同时创建

4、Java 线程执行终止后,本地线程也会回收

5、操作系统负责所有线程的安排调度到任何一个可用 CPU 上

6、一旦本地线程初始化成功,操作系统就会调用 Java 线程中的 run() 方法

 

JVM 系统线程

1、调试工具可以查看在后台有许多线程在运行

2、后台线程不包括调用 public static void main(String[] args) 的 main 线程,以及所有这个 main 线程自己创建的线程

3、在 Hotspot JVM 中的主要后台系统线程

(1)虚拟机线程:只有在 JVM 达到安全点才会出现,这样堆才不会变化,这种线程的执行类型包括 stop-the-world 垃圾收集、线程栈收集、线程挂起、偏向锁撤销

(2)周期任务线程:体现时间周期事件,比如:中断,一般用于周期性操作的调度执行

(3)GC 线程:为 JVM 中不同种类的垃圾收集行为提供支持

(4)编译线程:在运行时会将字节码编译成到本地代码

(5)信号调度线程:接收信号并发送给 JVM,在它内部通过调用适当的方法进行处理

 

程序计数寄存器

1、Program Counter Register

(1)Register 命名源于 CPU 寄存器,寄存器存储指令相关的现场信息

(2)CPU 只有把数据装载到寄存器才能够运行

2、JVM 中的程序计数器

(1)不是广义上所指的物理寄存器,是对物理 PC 寄存器的一种抽象模拟

(2)译为指令计数器 / 程序钩子

(3)它是一块很小的内存空间,几乎可以忽略不记,也是运行速度最快的存储区域

(4)在 JVM 规范中,每个线程都有自己的程序计数寄存器,属于线程私有,生命周期与线程的生命周期保持一致

(5)任何时间一个线程都只有一个方法在执行,即当前方法

(6)存储当前线程正在执行 Java 方法的 JVM 指令地址;如果是在执行 native 方法,则是未指定值(undefined)

(7)它是程序控制流的指示器,由程序计数寄存器来完成分支、循环、跳转、异常处理、线程恢复等基础功能

(8)字节码解释器工作时,通过改变程序计数寄存器的值,来选取下一条需要执行的字节码指令

(9)唯一一个在 JVM 规范中,没有规定任何 OutofMemoryError 情况的区域

3、作用

(1)存储指向下一条指令的地址,即将要执行的指令代码

(2)由执行引擎读取下一条指令

4、存储字节码指令地址、记录当前线程的执行地址的原因

(1)JVM 字节码解释器,需要通过改变程序计数寄存器的值,来确定下一条应该执行什么样的字节码指令

(2)因为 CPU 需要不停的切换各个线程,切换线城时,需要知道接着从哪开始继续执行

5、每个线程的程序计数寄存器都为私有的原因

(1)由于 CPU 时间片轮限制,多线程在并发执行过程中,在一个特定的时间段内,一个处理器或多核处理器中的一个内核,只会执行其中某一个线程的方法,CPU 不停地做任务切换,这样必然导致经常中断或恢复

(2)为了保证准确地记录各个线程正在执行的当前字节码指令地址,每个线程创建后,都分配一个程序计数寄存器、栈帧,各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况

 

CPU 时间片

1、CPU 分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片

2、宏观上:可以同时打开多个应用程序,每个程序并行不悖,同时运行

3、微观上:由于只有一个CPU,一次只能处理程序要求的一部分,引入时间片,每个程序轮流执行、公平处理

posted @   半条咸鱼  阅读(36)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示