注:其中指令计数器以及其他隐含寄存器就相当于 PC寄存器
每个线程拥有一个PC寄存器,在线程创建的时候创建,pc寄存器总是指向下一条指令的地址,这样程序就知道下一步该干什么。在执行本地方法的时候,PC的值就是 undefined 复制代码
保存装载的类信息
类型的常量池
字段,方法信息
方法字节码 通常和永久区(Perm)关联在一起
注:JDK6时,String等常量信息置于方法区,JDK7的时候,已经移动到了堆 方法区中保存的类信息有可能会改变,比如热加载。但是与应用层面的信息相比来说是稳定的,所以方法区可以成为永久区,永久区并不代表就永久不变。 复制代码
Java栈 – 局部变量 包含参数和局部变量
Java栈 – 操作数栈
Java中没有寄存器,所有参数传递使用操作数栈 复制代码
Java栈 – 栈上分配
注 Java栈-栈上分配 小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上,逃逸情况是另一个线程中也是用到该对象 直接分配在栈上,可以自动回收,减轻GC的压力 大对象或者逃逸的对象无法栈上分配 复制代码
Java栈 -栈、堆、方法区交互
可见性:一个线程修改了变量,其他线程可以立即知道
保证可见性的方法
有序性
指令重排
线程内串行语义
指令重排的基本原则