一、早期(编译器)优化
语法糖
c#和java的泛型截然不同看似相同,c#是真实的泛型 编译运行一直存在 List<string> 和List<int> 就完全是两个类
而Java中 是伪泛型采用类型擦除的方法实现泛型 List<Integer> List<String> 运行期就是同一个类
编译期错误,无法识别两个方法。
语法糖:自动拆箱、装箱 可变参数 遍历循环
条件编译
二、晚期(运行期)优化
二者各有优势:
分层编译策略:
有两种进行热点探测的方式:
1.基于采样的热点探测 不精准容易受到线程阻塞影响判断
2.基于计数器的热点探测 较为精准但是有些麻烦 一般采用这种
回边计数器
达到阙值之后 会在后台编译代码
C1简单快速三段式编译
C2会执行所有的经典优化
ps
栈溢出错误 递归调用方法
1.公共子表达式
优化后
2.数组范围检查消除
3.方法内联
很多情况下虚拟机的内联都是一种激进优化
4.逃逸分析
三、JAVA与C++编译器的对比