有没有推荐的 Java 性能分析教程?[已关闭]

2022-09-01 15:18:07

是否有任何推荐的 Java 应用程序分析教程?

我现在正在使用JProfilerEclipse Test & Performance Tools Platform(TPTP)进行分析。然而,尽管装备了出色的武器,但作为Java分析新手,我仍然缺少查明瓶颈的一般理论和技能。


答案 1

分析是一门具有多种思想流派的学科。

更受欢迎的一个是你通过测量来继续。也就是说,您尝试查看每个函数需要多长时间和/或调用多少次。显然,如果一个函数只需要很少的时间,那么加速它对你来说就没什么好处了。但是,如果它需要花费大量时间,那么您必须进行侦探工作,以弄清楚该功能的哪一部分负责时间。不要指望函数时间加起来就是总时间,因为函数互相调用,而函数A可能需要很多时间的原因是它调用函数B也花费了大量时间。

这种方法可以发现很多问题,但它取决于你是一个好的侦探,并且能够清楚地思考不同类型的时间,比如挂钟时间与CPU时间,自拍时间与包容性时间。例如,应用程序可能看起来很慢,但函数时间可能全部报告为接近零。这可能是由程序受 I/O 绑定引起的。如果 I/O 是你所期望的,那可能很好,但它可能正在做一些你不知道的 I/O,然后你又回到了侦查工作。

分析器的一般期望是,如果你能修复足够多的东西来获得10%或20%的加速,那就太好了,我从来没有听说过分析器被反复使用来获得比这更多的加速的故事。

另一种方法不是测量,而是捕获。它基于这样一种想法,即在程序花费的时间(挂钟时间)比你想要的更长的时间内,你想知道它在做什么,主要是,找出答案的一种方法是停止它并询问,或者拍摄它的状态快照并分析它,以完全理解它在做什么以及为什么它在那个特定的时间点这样做。如果您多次执行此操作,并且您多次看到它正在尝试执行的操作,那么该活动是您可以进行富有成效的优化。不同之处在于,你不是在问多少;你在问什么为什么这是另一种解释。(请注意,拍摄此类快照的速度并不重要,因为您不是在询问时间,而是在询问程序正在做什么以及为什么。

在Java的情况下,这里有一种低技术但非常有效的方法来做到这一点,或者你可以使用Eclipse中的“暂停”按钮。另一种方法是使用特定类型的探查器,一种对整个调用堆栈进行采样的探查器,在挂钟时间(不是CPU,除非你想对I / O视而不见),当你希望它采样时(例如,在等待用户输入时),并在代码行级别进行总结,而不仅仅是在函数级别, 和时间的百分比,而不是绝对时间。为了获得时间百分比,它应该告诉您,对于任何样本上出现的每行代码,包含该行的样本的百分比,因为如果您可以使该行消失,您将保存该百分比。(你应该忽略它试图告诉你的其他事情,比如调用图、递归和自拍时间。很少有符合此规范的分析器,但一个是RotationRight/Zoom,但我不确定它是否适用于Java,可能还有其他的。

在某些情况下,在实际缓慢期间,可能很难在需要时获取堆栈样本。然后,由于您追求的是百分比,因此您可以对代码执行任何操作,以便更轻松地获取示例而无需更改百分比。一种方法是通过围绕代码包装一个临时循环来放大代码,例如100次迭代。另一种方法是在调试器下设置数据更改断点。这将导致代码的解释速度比正常情况慢 10-100 倍。另一种方法是使用闹钟计时器在减速期间关闭,并用它来抓取样本。

使用捕获技术,如果您反复使用它来查找和执行多个优化,则可以期望达到接近最佳性能。对于瓶颈较多的大型软件,这可能意味着实质性因素。Stack Overflow 上的人们报告了从 7x 到 60x 的因子。下面是一个 43x 的详细示例。

捕获技术在难以弄清楚线程在等待时等待的原因(例如,在另一个处理器上等待事务完成时)遇到问题。(测量也有同样的问题。在这些情况下,我使用一种费力的方法来合并带时间戳的日志。


答案 2

我正在使用Yourkit Java Profiler 11.0,它非常好,以便进行内存优化和监控CPU时间。此外,yourkit网站有一个很好的知识库和帮助主题。


推荐