jvm原理
2019-05-20 14:14:07 101 举报
AI智能生成
jvm原理
作者其他创作
大纲/内容
jvm原理
类的加载过程
加载:查找.class文件的二进制数据,读入到JVM内存中,并生成class对象作为访问入口
准备:为class对象和类元数据信息分配内存空间,并初始化静态变量和常量值
解析:主要是将字节码中的符号引用转化为直接引用
验证:验证类文件的结构是否符合规范,有没有安全性的问题,类的元数据,字节码是否合法,符号引用是否正确等
Java编译
ECJ:将*.java文件编译为*.class
JIT:将.class文件中的字节码编译为机器码
AOT:将*.java文件直接编译为机器码
JVM编译
解释器:省去编译时间,程序启动速度快,不需要存储编译结果,节省存储编译代码内存空间。解释器也成为逆优化
编译器
运行模式:两种,client模式和server模式,client简单优化、编译代码速度快,server更深层次优化、编译速度相对慢一些
编译模式:jvm默认采用解释+JIT编译器混合编译模式
操作系统内存结构
栈区:由编译器自动分配释放,存放函数的参数值、局部变量的值的等,内存的分配连续,当声明变量时,编译器自动从当前栈区的结尾来分配内存
堆区:堆在操作系统对进程初始化的时候分配,在运行过程中也可以向系统要额外的堆
全局区:存储全局变量和静态变量
常量区:存放常量字符串
代码区:存放函数体的二进制代码
Java内存模型
主内存
lock:把一个变量标识为一条线程独占状态
unlock:把一个处于锁定状态的变量释放出来,释放后的变量才可以被其它线程锁定
read:把一个变量值从主内存传输到线程中的工作内存中,以便随后的load动作使用
load:它把read操作从主内存中得到的变量值放入工作内存的变量副本中
工作内存
use:把工作内存中的一个变量值传递给执行引擎
assign:把一个从执行引擎接收到的值赋值给工作内存中的变量
store:把工作内存中一个变量的值传递到主内存中,以便随后的write操作
write:把store操作从工作内存中一个变量的值传送到主内存的变量中
线程
总线
分类
片内总线:cpu内部的数据传输的连接线,也被称为局部总线
系统总线
数据总线:是cpu与内存或其他器件之间的数据传输的通道。数据总线的宽度决定了cpu和外界的数据传输速度。每条数据线一次只能传输一位二进制数据。数据总线就是数据线数量之和
地址总线:cpu是通过地址总线来指定存储单元的。地址总线决定了cpu所能访问的最大内存空间的大小
控制总线:cpu通过控制总线对外部器件进行控制。控制总线的宽度决定了cpu对外部器件的控制能力
结构
早期双总线结构
单总线结构(BIO)
双总线结构
三总线结构
三总线结构的变形(通道)(NIO)
四总线结构(IO处理机)(AIO)
线程安全的性质
原子性:满足原子性操作的一般都是线程安全的
可见性:一个线程对主内存的修改可以及时地被其他线程看到。由final、volatile(强制更新+读取主内存)以及同步技术实现
有序性:程序理论上是顺序执行的,但由于提高缓存命中和加快执行速度,使得指令重排,因此导致线程安全问题,可通过先行发生原则来判断线程是否是安全的
先行发生原则:保障线程安全有序性
程序次序原则:按照程序的控制流顺序执行代码
管程锁定原则:一个unlock操作先行发生于后面对同一个锁的lock操作
volatile原则:对于一个volatile修饰的变量,对他的写操作先行发生于读操作
线程启动原则:thread对象的start()方法先行发生于此线程的每一个动作
线程中断原则:对线程的interrupt()方法先行发生于被中断线程的代码所检测到的中断事件
线程终止原则:线程所有的操作都先行发生于对此线程的终止检测
对象终止原则:一个对象的初始化完成先行发生于对象的finilize()方法的开始
传递性:A先行发生于B,B先行发生于C,A一定先发生于C
垃圾回收
对象
创建
执行new操作码指令:在常量池中定位符号引用,并判断类是否被
新对象分配内存
对象的设置
执行invok指令对象初始化-赋值
0 条评论
回复 删除
下一页