描述
- 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务
- 在java多线程中是通过线程切换的来实现的,在切换到下一个线程过程中需要记录当前线程的正在执行的虚拟机字节码指令地址(执行Native方法时计数器为Undefined),CPU切换回来时会按照计数器记录的行数继续执行
- 每一个线程都有一个程序计算器并且是线程独享
- Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
验证
- 验证代码
package com.superxu.jvm;
public class ProgramCounterRegister {
public static void main(String[] args) {
int i = 1;
int j = 2;
int k = 3;
}
}
- 通过javap -c 查看java编译器生成的字节码
- iconst_1 将int类型常量1压入栈
- istore_1 将int类型值存入局部变量1
- iconst_2 将int类型常量2压入栈
- istore_2 将int类型值存入局部变量2
- iconst_3 将int类型常量3压入栈
- istore_3 将int类型值存入局部变量3

- 线程切换图
- 当线程A获得cpu调度,当执行完字节码指令3后,线程A失去CPU调度,此时保存线程A字节码指令为4,A线程处于等待状态
-
当线程B执行到指令5时,失去cpu调度,线程A重新得到cpu调度,查看线程A种中计数器指令,继续执行线程A
1541662713279.png
网友评论