2

我想要做的是在 Java 应用程序通过脚本任务时生成一个带有 CPU 计时信息的调用树。这个想法是查看代码的每个部分花费了多少时间,以及当我更改代码或任务时这会如何变化,但要以一致可重复的方式进行。

在 Java VisualVM 中,我可以通过单击开始和停止分析以交互方式执行此操作,但我想自动化该过程,以便获得更一致的结果(并且不会那么无聊)。VisualVM 可以做到这一点,还是有另一个分析器可以做到这一点?

4

1 回答 1

-1

如果我是分析器供应商,我将不得不关心为人们提供他们认为他们想要的东西,即使他们认为他们想要的东西并不能解决他们遇到的问题。

问题是,只有知道例程通常需要多长时间才能找到一些问题,如果你忽略那些你没有找到的问题,它们将成为你的程序需要多少时间的主要部分。

我的意思的一个例子是最近的例子:一个程序花费 50% 的挂钟时间读取 .dll 文件来查找字符串资源以获取文件名,以便字符串可以显示在启动屏幕上,因此用户可以看到在应用程序启动期间发生了一些事情。这意味着,如果有其他方式可以让用户眼前一亮,应用程序的启动速度可能会提高一倍。在此过程中,调用堆栈通常有 15-20 个函数深度,因此仅通过函数的时间编号很难判断发生了什么。

使问题变得困难的是它是语义的。没有一个特定的例程是“热”的,它可以被加速。唯一“热门”的事情是总体上对程序正在做什么的一般描述,没有工具可以为您隔离它。只有你能认出它。

但是,如果您只是在启动期间中断程序并检查调用堆栈,那么您有 50% 的可能性会看到所花费时间的全部解释。如果你多次这样做,它是一些程序员所依赖的随机暂停技术的基础,因为它会发现每一个问题分析器可以找到,甚至更多,而其他人则因为它不是工具而看不起。

并以交互方式执行此操作,或者使用类似于pstack的方法提取少量堆栈样本。

于 2013-07-02T20:24:09.830 回答