低门槛-JVM系列2
JVM体系
》类加载机制
》编译与反编译
》JVM内存结构
》JVM内存模型
》垃圾回收
》JVM参数及调优
》JVM对象模型
》JVM对象模型
编译与反编译
编译
前端编译:将java文件转变为jvm可以识别的字节码文件 流程:词法分析》符号流-语法分析》语法树-语义分析》语法树-代码生成 优点:一些语法糖的内容可以在这个阶段完成不需要再到JVM执行 缺点:对代码运行速度没有任何的优化;需要结合JIT才能完成编译流程 编译器:javac ,eclipse JDT中的ECT 后端编译:(JUST IN TIME complier 即时编译)在运行时把Class文件字节码编译成本地机器码的过程 流程: 机器无关代码优化》中间代码-代码生成》机器语言代码-机器相关代码优化》最终的机器代码 优点:收集监控信息,来收集热点代码,转化为本地机器代码,提高了执行速度 缺点:因为需要收集监控信息,所以会影响程序 后端编译器:HotSpot虚拟机的C1、C2编译器
反编译:就是将.class文件 转换成.java文件
反编译的工具:javap、jad、crf Javap:jdk自带的反编译器工具
JIT优化:
逃逸分析:分析对象动态作用域的分析技术,不是算法,只是进行优化的前提验证条件 方法逃逸:当一个对象在方法中被定义以后,则可能被外部方法所引用 线程逃逸:在方法逃逸的基础上,有可能被外部线程所访问 栈上分配:如果对象不会方法逃逸,那么把这个对象在栈上分配内存,对象所占的空间会随栈帧出栈而销毁.对象会随着方法的结束而销毁,则会减少gc的压力 标量替换:如果一个对象没有逃逸,并且如歌这个对象可以被拆散的话,那程序真正执行的时候,可能不会在创建该对象,而是改为直接创建它的诺个被这个方法使用到的成员来使用 同步消除:线程同步本身就是一个相对耗时的过程,如果逃逸分析能够确定一个变量不会逃逸出线程,无法被其他线程访问,那这个变量的读写肯定就不会有竞争,对这个变量实施的同步操作也就可以消除掉。 锁优化:减少锁持有时间、减少锁粒度、读写分离锁代替独占锁、锁分离、锁粗化
AOT编译:(ahead of time 静态提前编译)直接将java 源码编译为本地机器码
优点:把编译的机器码存储到磁盘,不占用内存 缺点:提高了复杂度 编译器:ART (Android Runtime)#