垃圾回收与即时编译(JIT)

Java 代码优化

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

垃圾回收:基础

手动内存管理(C/C++)

  • 程序员显式分配与释放内存
  • 易发生内存泄漏

$$

Java 的垃圾回收

  • 自动分配内存
  • 自动检测未使用对象
  • 自动回收内存
Java 代码优化

垃圾回收如何工作

  • 标记:从根识别可达对象
  • 清除:移除不可达对象

2025-05-11 下午6:58:38 的截图.png

Java 代码优化

垃圾回收与性能

GC 性能取舍

  • 简化开发,但带来性能考量

$$

GC 算法

  • 现代 JVM 提供多种垃圾回收算法
  • 选择取决于应用需求
  • 深入指南见此处
1 https://www.baeldung.com/jvm-garbage-collectors
Java 代码优化

GC 的性能影响

// 不佳——创建大量短生命周期对象
for (int i = 0; i < 1000000; i++) {
    new Object(); // 立刻变为垃圾
}


// 对比:复用对象 Object obj; for (int i = 0; i < 1000000; i++) { obj = new Object(); // 只有一个引用 }
Java 代码优化

友好的 GC 编码

// 在性能关键代码中避免这样做
String result = "";
for (int i = 0; i < 100000; i++) {
    result += i; // 每次都会创建新字符串
}


// 更好的做法 StringBuilder builder = new StringBuilder(); for (int i = 0; i < 100000; i++) { builder.append(i); // 复用同一缓冲区 } String result = builder.toString();
Java 代码优化

即时编译(JIT)

  • JVM 执行流程:
    • Java 源码 -> 字节码
    • 字节码 -> 解释执行
    • 热点方法 -> 本机机器码
  • 重点优化高频执行代码
Java 代码优化

JIT 友好模式

  • 编写可预测的代码
// 可预测的分支有助于 JIT 优化
if (value > 0) {
    // 代码 A - 常走路径
} else {
    // 代码 B - 少走路径
}
  • 将方法拆小、更聚焦
  • 体积小、调用频繁的方法更易内联
  • 复杂代码通常更难被高效优化
Java 代码优化

小结

  • 在性能关键路径上尽量减少对象创建
  • 编写与 JIT 优化能力相契合、可预测的代码
  • 先做性能分析,再把优化集中在关键代码上
Java 代码优化

Let's practice!

Java 代码优化

Preparing Video For Download...