本文已参与「新人创作礼」活动,一起开启掘金创作之路。
运行时数据区概述
内存是cpu和硬盘交互的桥梁 不同的jvm对内存的管理和划分都有区别,主要基于HotSpot进行学习 运行时数据区其实就是内存
运行时数据区可以分为两种
- 与jvm的生命周期保持一致 即每个线程共享的 (上图中的红色部分)
- 与线程的生命周期保持一致 即每个线程独一份 (上图中分非红色部分)
阿里java手册中也对jvm运行时数据区进行了划分
线程
jvm允许多线程 每个jvm的线程都与操作系统的本地线程有映射关系 每个java线程准备好运行时,就会创建一个本地线程,当java线程销毁之后,本地线程也会回收 但是本地线程回收之前需要判断销毁的线程是否是最后一个非守护线程 如果是的话,jvm也随之销毁 **线程分为 守护线程 **普通线程
jvm中的线程分为一下几种
- 虚拟机线程
- 周期任务线程
- gc线程
- 编译线程
- 信号调度线程
JVM PC Register是对CPU物理寄存器的一种模拟 CPU程序寄存器主要存储指令相关的现场信息,CPU只有把数据装载到寄存器才能够运行
程序寄存器介绍
作用
存储下一条指令的地址,也就是即将执行的代码
执行过程
- 如上图所示,程序会被编译成具体的指令代码
- 指令地址就是保存在pc寄存器的地址
- 执行引擎通过获取pc寄存器的地址来获取执行的指令,操作局部变量表,操作数栈,再编译成机器指令,交给cpu运算
常见问题
使用pc寄存器存储字节码指令地址有什么用? 为什么使用pc寄存器记录当前线程的执行地址?
cpu是需要不停切换线程的,切换完之后需要知道之前执行到哪一步了,Jvm的字节码解释器就通过修改pc寄存器的值来明确接下来要执行的命令
pc寄存器为什么会被设置为线程私有?
cpu切换线程后必须要获取此线程上次执行到哪一步了,然后继续执行,如果pc寄存器是线程共享的,可能会出现线程间执行命令混乱的情况
Cpu时间片 扩展知识
cpu分配给不同的线程的执行时间,cpu的一个内核同时只能执行一个命令.