主要观点:多数编译器工程师认为向编译器暴露尽可能多的编译信息是好事,希望编译器能进行更精确分析和优化,但复杂软件产品需权衡,文中以 C2 编译器为例,说明应减少输入编译器的程序信息量。
关键信息:
- C2 中处理垃圾收集(GC)屏障的两种方式:早期屏障扩展(将屏障转换为中间表示操作)和晚期屏障扩展(在代码生成时插入对应指令)。
- G1 收集器只需写入屏障,其写入屏障在 C2 的中间表示中由 100 多个操作和 50 多条 x64 指令组成,导致中间表示增大,增加编译开销约 20%。
- 晚期屏障扩展简单且实现成本低,能使 C2 提速,还可复用 JDK 中已有的平台相关 G1 屏障实现。
- 虽理论上晚期屏障扩展产生的代码质量较差,但实际中在 C2 中从早期到晚期 G1 屏障扩展未观察到显著性能下降。
重要细节: - 早期屏障扩展是 C2 处理 JVM 默认收集器所需屏障的当前选择。
- 文中以简单的方法
void write(Foo foo, Bar bar) { foo.f = bar; }及其对应的 C2 中间表示图展示了 G1 写入屏障的情况。 - 提到若编译器针对 15 个不同平台,晚期屏障扩展模型的维护性较差,但 JDK 已有相关实现可复用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。