1.javac把java代码编译成字节码(中间代码),然后由java虚拟机解释执行
2.jit(运行时编译)把java代码直接编译成机器码,然后由java虚拟机直接运行(缓存)。有对客户端的C1和对服务器端的C2编译器
缓存
代码优化
逃逸分析,是否超出范围。对不同逃逸状态做优化
全局逃逸
对象超出了方法或线程的范围,比如被存储在静态字段或作为方法的返回值。
参数逃逸
对象被作为参数传递或被参数引用,但在方法调用期间不会全局逃逸。
无逃逸
对象可以被标量替换,意味着它的内存分配可以从生成的代码中移除。
锁消除
借助逃逸分析来判断同步块所使用的锁对象是否只能够被一个线程访问而没有被发布到其他线程。
编译这个同步块的时候就会取消对这部分代码的同步
标量替换&栈上分配
经过逃逸分析,发现一个对象不会被外界访问的话,那么经过JIT优化,就会把这个对象拆解成若干个其中包含的若干个成员变量来代替。这个过程就是标量替换。
某一个局部对象没有逃逸到线程和方法外的话,那么这个对象就可能不会在堆上分配内存,而是进行栈上分配。用完直接删
锁膨胀
方法内联
方法内联意味着将一个方法的代码直接插入到调用它的地方,从而避免了方法调用的开销。
3.aot编译就生成机器码,是静态编译技术(深入理解JVM 1.5.3)
java程序之所以能做静态编译,就是因为封闭性假设,要求所有运行时内容必须在编译时可见,并且可以被编译到native image。
编译后平台相关性,不会再run anywhere
但是aot编译尽管没有编译时间的压力,效果不一定比JIT效果好
标签:java,JAVAC,对象,编译,JIT,逃逸,线程
From: https://www.cnblogs.com/liang302/p/18179014