Hacker News 中文摘要

RSS订阅

Java 25 的全新 CPU 时间分析器(1) -- Java 25's new CPU-Time Profiler (1)

文章摘要

Java 25引入了全新的CPU时间分析器,作为OpenJDK 25的一部分,旨在帮助开发者更有效地发现代码性能问题。该分析器相较于现有方法采样器具有显著优势,本周文章将探讨其必要性和提供的信息,下周将深入技术细节。

文章总结

Java 25 的新 CPU 时间分析器(1)

经过三年多的开发,特别是从去年开始的集中努力,我的 CPU 时间分析器终于在 OpenJDK 25 中落地。这是一个实验性的新分析器/方法采样器,帮助开发者发现代码中的性能问题,相比现有的采样器具有显著优势。本周的博客将介绍为什么我们需要一个新的分析器以及它提供的信息,下周则会深入探讨技术细节,超越 JEP 中的描述。

当前 JFR 分析策略

JDK 25 的默认方法分析器也有所改变,但分析策略保持不变。每隔一定时间(如 10 或 20 毫秒),从线程列表中选取五个运行在 Java 中的线程和一个运行在本地代码中的线程进行采样。这种策略存在一些问题,特别是在大型机器上,由于线程数量多,采样间隔可能会被拉长,导致采样率下降。

问题

当前的采样策略并非真正的“执行时间”采样,因为它优先选择运行在 Java 中的线程。例如,如果有 10 个线程运行在本地代码中,5 个运行在 Java 中,采样器总是选择所有运行在 Java 中的线程,而只选择一个运行在本地代码中的线程。这可能会导致用户得出错误的结论。

执行时间示例

考虑一个程序 HttpRequests,其中两个线程分别执行 HTTP 请求。一个线程运行 tenFastRequests 方法,向一个响应时间为 10 毫秒的 HTTP 端点发送十个请求;另一个线程运行 oneSlowRequest 方法,向一个响应时间为 100 毫秒的端点发送一个请求。虽然两者的平均延迟相同,但 tenFastRequests 方法会消耗更多的 CPU 时间,因为创建请求和处理响应需要更多的 CPU 周期。

CPU 时间分析

新的 CPU 时间分析器通过 Linux 内核的 CPU 计时器,每隔固定的 CPU 时间间隔对每个线程进行采样。这种方法避免了子采样问题,采样数量直接与线程在 CPU 上花费的时间相关。

新分析器的问题

最大的问题是平台支持有限,目前仅支持 Linux。虽然这对生产环境影响不大,但在开发环境中可能会带来不便,因为大多数开发工作是在 Windows 和 Mac OS 上进行的。

为什么它进入了 JDK 25?

为了让更多用户能够体验这一功能,我们决定将其纳入 JDK 25。尽管它仍处于实验阶段,默认关闭,但我们认为它已经足够成熟,可以通过后续的 bug 修复进行改进。

新 CPUTimeSample 事件

新的分析器引入了一个新的事件 jdk.CPUTimeSample,用于记录每个线程在固定 CPU 时间间隔内的堆栈信息。该事件与现有的 jdk.ExecutionSample 事件类似,但专注于 CPU 时间。

CPU 时间分析器的配置

新的分析器通过 throttle 设置来控制事件的生成频率,可以设置为采样间隔或每秒生成事件的上限。

新的 JFR 视图

新增了两个视图:cpu-time-hot-methods 显示执行最多的方法列表,cpu-time-statistics 提供采样统计信息,包括成功、失败、偏置和丢失的采样数量。

结论

尽管在 JDK 25 中引入这个新分析器是一个巨大的挑战,但我们认为这是值得的。OpenJDK 现在有了一个内置的 CPU 时间分析器,能够记录丢失的采样,并基于 JFR 的新协作采样方法。CPU 时间分析在优化代码性能方面具有显著优势,特别是在识别消耗 CPU 资源的代码时。

这是关于新分析器的两篇系列文章的第一部分,下周将深入探讨其实现细节。

评论总结

评论内容总结:

  1. 对Java近年创新的高度认可

    • 评论1(exabrial)指出,过去6-8年JVM在创新和功能方面表现出色,令人印象深刻。
      "The JVMin in the last 6-8 years has been a powerhouse of innovation and cool features."
    • 评论2(tombert)表示,自Java 21以来,编写Java变得有趣,语言设计者做得很好。
      "Whomever is running it has really done a good job making the language actually fun to write in the last few years."
  2. 对Java性能的质疑

    • 评论3(zerr)认为,如果对性能有极高要求,不应使用Java或其他带有垃圾回收机制的语言。
      "If you care about performance at that level, you should not be using Java or any other language with a GC."
  3. 对Java的怀旧与回归倾向

    • 评论4(okokwhatever)提到,在寻找新语言学习时,反而更想回归Java,感到怀旧。
      "The more I search for a new language to learn the more I want to go back to Java. I feel so nostalgic :)"

总结:评论者对Java近年来的创新和语言设计普遍持积极态度,但也有人对其性能提出质疑。同时,部分用户对Java表现出怀旧情感,认为其仍有吸引力。