- 虚拟机执行字节码 解释执行 编译执行(及时编译器) 虚拟机将热点代码编译为与本地机器相关机器码,并进行各层次的优化 热点代码:运行频繁的代码块(循环体)或者方法 1) 基于采样热点探测:周期性检查各个线程的栈顶 2) 基于计数器 回边计数器(循环) 方法调用计数器:给方法设置一个计数器,每次调用则计数值+1,规定时间没有到达阈值,计数减半,成为半衰期 三个层次优化 1) 第一层:解释器关闭性能检测,发出c1层编译 2) 第二层:编译为本地代码,并进行可靠优化,必要会开启性能检测逻辑 3) 第三层:编译为本地代码,进一步优化,根据性能监控可能发生不可靠的激进优化 及时编译器优化技术 1) 公共子表达式:表达式已经计算,并且这次的计算值为改变,直接使用之前的计算结果 2) 数组边界消除:确定不会越界的情况下,去除数组边界检查 3) 方法内联:检查调用方法,如果不是一个虚方法,则直接内联,虚方法会检查是否有多个版本可选,如果只有一个,会内联,但是会有一个逃生门,成为守护内联(属于激进优化) 虚方法:可以被重写的方法 4) 逃逸分析 方法逃逸:对象在方法内部被定义后,被外部方法引用 线程逃逸:被外部线程访问 非逃逸优化 a) 对象放置在栈中 b) 同步消除 c) 标量替换:不创建对象,配置被使用成员变量 解释器与编译的交互
程序开始执行时由解释器执行字节码命令,随着时间的推移,及时编译器也开始工作,将热点代码编译为与本地机器相关的机器码。
Javac编译class文件 解释与符号填充 插入式注解器处理注解 分析与class文件生成
java中方法调用 (对象.方法名)确定调用的方法 方法调用字节码指令 1) Invokestatic:静态方法调用 2) Invokespecial:构造方法,私有方法,父类方法 3) Invokevirtual:调用虚方法 4) Invokeinterface:调用接口