1 运行时数据区
1.1 运行时数据区内存结构
jvm启动时会使用到运行时数据区,其中是有与线程对应(随着虚拟机退出而销毁),另外一些则是与线程一一对应
每个线程:程序计数器,栈,本地栈
线程间共享:堆,方法区(jdk8后面是使用元空间-本地内存实现)
1.2 RunTime介绍
Runtime:运行时,是一个封装了JVM进程的类。每一个JAVA程序实际上都是启动了一个JVM进程,那么每一个进程都是对应这一个Runtime实例,其实例是由JVM为其初始化的。
2 线程
-
线程是一个程序里的运行单元
-
HostPot jvm里的每个线程都是与操作系统的本地线程直接映射的
-
当一个java线程准备好执行后,操作系统的本地线程也同时创建,java线程执行终止后,本地线程也会回收
-
操作系统负责所有线程的安排到任何一个可用的cpu上,一旦本地线程初始化成功,它就会调用java线程的run方法
2.1 hostpot后台系统线程分类
-
虚拟机线程:线程栈手机,线程挂起等
-
周期任务线程:时间周期时间的体现(中断)
-
gc线程:对垃圾回收机制提供了支持
-
编译线程:运行时将字节码编译成本地代码
-
信号调度线程
3 pc寄存器
-
这里存储指令相关信息,jvm中的pc寄存器是对物理寄存器的一种抽象模拟。
-
每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程间的周期保持一致
-
pc计数器会存储当前线程正在执行java方法的jvm指令地址。如果执行的是本地方法 里面的值则是未定义的
作用:记录下一条要执行的字节码指令。是程序流程的指示器,异常处理、线程恢复等操作都要依赖程序计数器来完成。
流程
3.1 pc面试题
1.使用pc寄存器存储字节码指令地址有什么用?
因为cpu需要不停切换线程,这时候切换回来,就需要知道从哪里据需开始。
jvm的解释器需要通过改变pc来明确下一条应该执行什么样的字节码指令。