运行时数据区及程序计数器
概述
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,一次只能处理程序要求的一部分,引入时间片,每个程序轮流执行、公平处理
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战