JVM

来源:互联网 发布:去日本带mac好吗 编辑:程序博客网 时间:2024/05/16 19:07

JVM基本结构

这里写图片描述

PC寄存器
每个线程拥有一个PC寄存器
在线程创建时 创建
指向下一条指令的地址
执行本地方法时,PC的值为undefined

方法区
保存装载的类信息
类型的常量池
字段,方法信息
方法字节码
通常和永久区(Perm)关联在一起

Java堆
和程序开发密切相关
应用系统对象都保存在Java堆中
所有线程共享Java堆
对分代GC来说,堆也是分代的
GC的主要工作区间

Java栈
线程私有
栈由一系列帧组成(因此Java栈也叫做帧栈)
帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈

栈、堆、方法区交互

这里写图片描述

内存模型

每一个线程有一个工作内存和主存独立
工作内存存放主存中变量的值的拷贝

这里写图片描述

当数据从主内存复制到工作存储时,必须出现两个动作:
第一,由主内存执行的读(read)操作;
第二,由工作内存执行的相应的load操作;
当数据从工作内存拷贝到主内存时,也出现两个操作:
第一个,由工作内存执行的存储(store)操作;
第二,由主内存执行的相应的写(write)操作

每一个操作都是原子的,即执行期间不会被中断

对于普通变量,一个线程中更新的值,不能马上反应在其他变量中

如果需要在其他线程中立即可见,需要使用 volatile 关键字

线程与共享变量间的关系
这里写图片描述

可见性

一个线程修改了变量,其他线程可以立即知道
保证可见性的方法
volatile
synchronized (unlock之前,写变量值回主存)
final(一旦初始化完成,其他线程就可见)

指令重排的基本原则
程序顺序原则:一个线程内保证语义的串行性
volatile规则:volatile变量的写,先发生于读
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C 那么A必然先于C
线程的start方法先于它的每一个动作
线程的所有操作先于线程的终结(Thread.join())
线程的中断(interrupt())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法

解释运行
解释执行以解释方式运行字节码
解释执行的意思是:读一句执行一句
编译运行(JIT)
将字节码编译成机器码
直接执行机器码
运行时编译
编译后性能有数量级的提升

0 0
原创粉丝点击