JVM 内存模型优化
Java 性能调优的基础是理解 JVM 内存模型。堆内存分为新生代和老年代,新生代又分为 Eden 区和两个 Survivor 区。合理配置各区域大小可显著提升性能。
-Xms 和 -Xmx 参数应设置为相同值以避免堆内存动态调整的开销。新生代与老年代的比例通过 -XX:NewRatio 调整,通常设置为 1:2 或 1:3。Survivor 区比例通过 -XX:SurvivorRatio 控制,建议 8 左右。
垃圾回收算法选择
根据应用特点选择合适的垃圾回收器。吞吐量优先场景使用 Parallel Scavenge + Parallel Old 组合,低延迟场景优先考虑 G1 或 ZGC。
CMS 回收器适合老年代回收,但会产生内存碎片。G1 回收器通过 Region 划分内存,适合大堆内存场景。ZGC 和 Shenandoah 实现亚毫秒级停顿,适合超低延迟需求。
内存分配优化
对象分配速度直接影响性能。TLAB(Thread Local Allocation Buffer)机制能减少线程竞争,默认开启。可通过 -XX:TLABSize 调整大小。
大对象直接进入老年代,避免在新生代来回复制。通过 -XX:PretenureSizeThreshold 设置大对象阈值,通常设为 1MB 左右。
垃圾回收日志分析
启用详细 GC 日志收集性能数据:-Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps。使用工具分析日志,找出频繁 GC 或长时间停顿的原因。
关注 Full GC 频率和持续时间。频繁 Full GC 可能说明老年代空间不足或存在内存泄漏。长时间停顿可能需要调整回收器参数或升级回收器版本。
代码层面优化
避免创建不必要的对象,特别是在循环体内。重用对象可通过对象池实现。及时释放资源,特别是数据库连接和文件句柄。
合理使用 finalize 方法,因其会导致对象回收延迟。软引用和弱引用适合缓存场景,但要注意及时清理。