目录
前端编译与优化
javac编译器
javac是java编写的
流程:
- 词法语法分析
- 符号填充
语法糖
泛型
- 类型擦除
- 具现化实现
java采用类型擦除的方式,也即导致了一系列问题,包含性能问题使用问题等…
- 无法使用泛型创建对象
- 重载时,
List<String>与List<Integer>
视作同样的参数 - 不支持基础类型
后端编译与优化
即时编译器
目前主流的两款商用Java虚拟机(HotSpot、 OpenJ9) 里, Java程序最初都是通过解释器(Interpreter) 进行解释执行的, 当虚拟机发现某个方法或代码块的运行特别频繁, 就会把这些代码认定为“热点代码”(Hot Spot Code) , 为了提高热点代码的执行效率, 在运行时, 虚拟机将会把这些代码编译成本地机器码, 并以各种手段尽可能地进行代码优化, 运行时完成这个任务的后端编译器被称为即时编译器。
解释器与编译器
程序需要迅速启动和执行,解释器可以首先发挥作用,省去编译时间.立即运行.程序启动后,随着时间推移,编译器发挥作用,把越来越多得代码编译成本地代码,减少解释器中间得消耗,获得更高得效率.当程序运行环境内存受到限制比较大,使用解释器执行,可以节约内存.反之使用编译器提升效率
编译对象与触发条件
热点代码:被多次调用的方法,被多次执行得循环体.
提前编译
提前编译得优劣
即时编译消耗的时间都是原本可用于程序运行的时间, 消耗的运算资源都是原本可用于程序运行的资源, 这个约束从未减弱, 更不会消失, 始终是悬在即时编译头顶的达摩克利斯之剑。
给即时编译器做缓存加速, 去改善Java程序的启动时间, 以及需要一段时间预热后才能到达最高性能的问题。 这种提前编译被称为动态提前编译(DynamicAOT) 或者索性就大大方方地直接叫即时编译缓存(JIT Caching) 。