javac编译过程
2017-03-19 12:43:54 0 举报
Javac编译过程是将Java源代码文件(.java文件)转换为字节码文件(.class文件)的过程。首先,Javac编译器读取源代码文件,然后对其中的语法和语义进行检查,确保代码符合Java语言规范。接下来,Javac将源代码分解为一个个的语法单元(如类、方法等),并为每个语法单元生成对应的字节码指令。最后,Javac将这些字节码指令写入到一个或多个字节码文件中,这些文件包含了程序运行所需的所有信息。整个过程在编译时进行,运行时不需要再次编译。
作者其他创作
大纲/内容
数据流、控制流分析
非虚方法内联
线程安全的五个等级
符号表
回边计数器(默认阀值:10700)
注解处理
是
守护内联
可中断等待
语法分析
修改MW的标记位为01,记录线程id
热点方法
热点代码
标注检查
抽象语法树
不同
执行时遇到invokevirtual指令
使用偏向模式
使用
线程
方法编译
不可变
是否启用了偏向锁
修改MW标记位为10
热点循环
否
前提条件是持有锁的线程正在执行
生成语法树
填充符号表
编译整个方法,下次循环时使用
执行
撤销偏向,切换为轻量级锁
存在半衰周期
偏向锁
类型继承关系是否变化
标量替换
解语法糖
生成字节码
MyProcesser
+MyScanner scanner
查找虚方法表,执行动态分派
公平锁
工作内存
逃逸分析
volatile
轻量级锁
代码
获得要调用的方法信息和类信息
基于逃逸分析可以实现很多高效优化
内联缓存
fianl修饰的常量
自适应的自旋锁
无优化
方法内联
生成实例和类构造器
ArrayList
不需要额外同步手段多线程下的单次操作可以获得正确的结果
非阻塞同步
Thread类的suspend()和resume()
比轻量级锁更乐观,连维护锁记录的开销都免去了
第1层:C1编译执行,可添加性能监控
OSR编译(栈上替换)
绝对线程安全
计数探测
第2+层:C2编译执行可能根据性能监控信息执行激进不可靠的优化
获取锁并执行
相对线程安全
相同
对它修饰的变量的写操作和读操作是互斥的
锁可绑定多个条件
扩大同步代码块的范围,避免反复获取和释放锁
是否有线程持有这个锁
Vector
class文件
a-b-c-d-e
ReentrantLock
是否存在多个可调用版本
是否改变了语法树的内容?
CAS替换MarkWorld,标记位为00
C2编译器
用于编译
热点探测方法
MyScanner
-visitType(类节点)-visitExecutable(方法节点)-visitVariable(变量节点)
e-d-b-c
速度慢,优化程度高,激进优化时有风险
变量无线程间逃逸
采样探测
分层编译策略
锁消除
synchronized
解释器
栈上分配
乱序执行
CAS
记录本次方法接受者信息
属于JIT编译的优化手段,基于逃逸分析
不需要额外同步手段,多线程的任意操作都可以获得正确结果
C1编译器
多线程下可以通过同步手段保证获得正确的结果
类型继承关系分析
比较方法接受者
执行内联
不相同
局部消除
是否改变了原本内容?
第0层:解释执行,无性能监控
锁是否释放
隐式异常处理(运行时)
全局消除
重量级锁
线程安全的代码实现
持有锁的线程是否正在运行
如果两计数器之和超过任一阀值即触发对应编译
b-d-c-e
不可变的量对任意线程都显然是安全的
校验线程id
线程逃逸
使用内联后的代码
编译时消除
切换为重量级锁
JIT编译器
b1
阻塞
ElementScanner6
scan(语法树节点)
维护等待队列,开始阻塞
java API中不存在这样的类
是否第一次调用此方法
方法计数器(默认阀值:10000)
java文件
编译速度快,优化程度低
判断锁类型
五种优化措施
上次使用了哪种优化方法
线程a遇到monitorenter命令
标记集合
方法逃逸
线程兼容
自旋若干次
公共子表达式消除
数组范围检查消除
乐观机制,免去了维护等待序列的开销
互斥同步
同步消除
java运行时编译
在栈帧上创建锁记录
没办法保证获得正确结果
可重人代码
主内存
AbstractProcesser
线程对立
例如
锁粗化
膨胀
不同于synchronized的新特性
jvm的优化和指令重排序
无同步
词法分析
d-c-e
虚方法内联
0 条评论
下一页