一、早期(编译器)优化

语法糖

c#和java的泛型截然不同看似相同,c#是真实的泛型 编译运行一直存在 List<string> 和List<int> 就完全是两个类

而Java中 是伪泛型采用类型擦除的方法实现泛型    List<Integer> List<String> 运行期就是同一个类

JVM读书笔记PART3-LMLPHP

编译期错误,无法识别两个方法。

语法糖:自动拆箱、装箱 可变参数 遍历循环

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

条件编译

JVM读书笔记PART3-LMLPHP

二、晚期(运行期)优化

JVM读书笔记PART3-LMLPHP

二者各有优势:

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

分层编译策略:

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

有两种进行热点探测的方式:

1.基于采样的热点探测 不精准容易受到线程阻塞影响判断

2.基于计数器的热点探测 较为精准但是有些麻烦  一般采用这种

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

回边计数器

JVM读书笔记PART3-LMLPHP

达到阙值之后 会在后台编译代码

C1简单快速三段式编译

C2会执行所有的经典优化

ps

JVM读书笔记PART3-LMLPHP

栈溢出错误 递归调用方法

JVM读书笔记PART3-LMLPHP

1.公共子表达式

JVM读书笔记PART3-LMLPHP

优化后

JVM读书笔记PART3-LMLPHP

2.数组范围检查消除

JVM读书笔记PART3-LMLPHP

3.方法内联

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

很多情况下虚拟机的内联都是一种激进优化

4.逃逸分析

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

三、JAVA与C++编译器的对比

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

JVM读书笔记PART3-LMLPHP

05-07 15:16
查看更多