Hacker News 中文摘要

RSS订阅

Java运行快,代码未必快 -- Java is fast, code might not be

文章摘要

文章通过一个Java订单处理应用的性能优化案例,展示了代码优化带来的显著提升:处理时间从1198ms降至239ms,吞吐量从8.5万/秒提升至41.9万/秒。作者指出这些常见但易被忽视的代码反模式虽能通过编译和代码审查,但会严重影响性能,并预告将在后续文章中详细分析性能剖析数据和具体优化方法。

文章总结

Java性能优化:你的代码可能拖慢了程序

在DevNexus技术大会上,我展示了一个Java订单处理应用的性能优化案例。通过修复8个常见反模式,该应用的性能得到显著提升:

优化前: - 耗时:1,198毫秒 - 吞吐量:85,000订单/秒 - 堆内存峰值:1GB - GC暂停:19次

优化后: - 耗时:239毫秒(提升5倍) - 吞吐量:419,000订单/秒 - 堆内存:139MB(减少87%) - GC暂停:4次(减少79%)

八大性能反模式及解决方案:

  1. 循环中的字符串拼接 问题:每次拼接都创建新String对象,导致O(n²)性能损耗 解决:使用StringBuilder预分配缓冲区

  2. 循环内的流式操作 问题:在循环内重复处理整个集合,导致O(n²)复杂度 解决:改用单次遍历的合并计数方式

  3. 热点路径使用String.format() 问题:每次调用都解析格式字符串,性能最差 解决:仅在必要时使用,或改用StringBuilder

  4. 热点路径的自动装箱 问题:频繁创建包装类对象导致GC压力 解决:使用基本类型(long)替代包装类(Long)

  5. 使用异常控制流程 问题:异常构造时的堆栈跟踪开销巨大 解决:预先验证输入,避免异常作为常规控制流

  6. 过宽的同步范围 问题:方法级同步导致线程争用 解决:改用ConcurrentHashMap和LongAdder等并发工具

  7. 重复创建可重用对象 问题:频繁初始化ObjectMapper等重量级对象 解决:声明为static final共享实例

  8. 虚拟线程阻塞(JDK 21-23) 问题:同步块内的阻塞操作会固定载体线程 解决:改用ReentrantLock(JDK24已优化此问题)

优化效果具有复合效应: - 单个优化可能效果有限,但组合使用能显著提升性能 - 在生产环境中,这些改进会因规模效应产生巨大收益 - 通过性能剖析可以识别真正的热点代码

后续内容预告: - 第二部分将展示优化前后的火焰图对比 - 第三部分将介绍性能改进的自动化流程

(注:原文中大量代码示例和技术细节已精简,保留了核心问题和解决方案的说明)

评论总结

以下是评论内容的总结:

1. 对Java性能的批评

  • 主要观点:Java性能问题包括启动延迟、内存消耗大、工具链不佳等。
    • "First request latency also can really suck in Java before hotpathed code gets through the C2 compiler." (评论3)
    • "I have yet to in my entire career see enterprise Java be performant and not memory intensive." (评论2)

2. 与其他语言的比较

  • 主要观点:Rust、C++、Go等语言在性能和可控性上优于Java。
    • "everybody should just be using Rust. That way you are actually in control, know what's going on" (评论1)
    • "Using C++, Go, or Rust gets you around that problem without having to jump through the hoops of code path warmup." (评论3)

3. Java编程实践中的优化建议

  • 主要观点:避免内存分配、使用数组替代Map、优化异常处理等。
    • "avoiding memory allocations... makes everything fast." (评论9)
    • "The issue with it is it's using a map when an array works both faster and just fine." (评论17)

4. 对Java生态和文化的批评

  • 主要观点:Java生态和文化对性能不够重视,工具链存在问题。
    • "the tooling, both Maven and Gradle, still stucks." (评论1)
    • "the culture around the language usually doesn't consider performance or efficiency to be a priority." (评论6)

5. 对AI和编程未来的看法

  • 主要观点:AI可能无法完全替代程序员,因为优化需要经验。
    • "Most of this stuff is just central knowledge of the language that you pick up over time." (评论24)
    • "will it always pick the most efficient path when generating code for you? Probably not" (评论24)

6. 其他观点

  • Java的历史声誉:"Java is slow is a reputation it earned in the 90s/2000s" (评论22)
  • 字符串处理的优化:"Java chose a single final class so all calls are direct. But they should have been able to have a very small sealed class hierarchy" (评论20)

总结:评论中对Java的性能和生态提出了多方面批评,同时与其他语言进行了比较,并提出了具体的优化建议。部分评论认为Java的文化和工具链是性能问题的主要原因,而另一些评论则探讨了AI对编程未来的影响。