16

我面临的情况是我没有看到VisualVM应用程序没有记录一些方法调用。想找出原因并在 SO 上找到了这个答案。第三点提到了采样方法的潜在问题(这是我看到启用的唯一选项,可能是因为我正在进行远程分析)。它提到了代码中的安全点和代码本身的安全点轮询。这些术语是什么意思?

4

2 回答 2

11

Java 采样分析器工具的不准确性问题及其与安全点的关系在Evaluating the Accuracy of Java Profiler (PLDI'10)中有很好的讨论。

本质上,由于采样发生在安全点期间,Java 分析器可能会在采样时产生不准确的结果。并且由于编译器可以修改安全点的出现,因此探查器可能永远不会对某些方法的执行进行采样。因此,分析器计划记录代码样本(时间间隔已到),但它必须等待安全点的出现。并且由于安全点例如由编译器移动,因此永远不会观察到理想采样的方法。

正如前面的答案已经解释的那样,安全点是代码中编译器中断执行以执行某些内部 VM 代码(例如 GC)的事件或位置。

安全点轮询是一种实现安全点或安全点触发器的方法。这意味着在正在执行的代码中,您定期检查一个标志以查看是否需要执行安全点,如果是(由于例如 GC 触发器),则线程被中断并执行安全点。参见例如GC 安全点(或安全点)和安全区域

于 2013-07-25T00:29:27.290 回答
6

这篇博文讨论了安全点。基本上,它们是代码中 JITter 允许 GC、堆栈跟踪等中断的点。

该帖子还说,通过延迟堆栈样本,安全点不会出现在您可能希望它们出现的地方,这是一个问题。

在我看来,这是一个小问题。您获取堆栈样本(而不仅仅是程序计数器样本)的全部原因是向您展示导致当前状态的所有调用站点,因为这些可能比任何程序都更加多汁的缓慢来源柜台正在做。(如果它正在做任何事情。你可能正处于 I/O 的中间,PC 没有意义,但调用站点仍然同样重要。)如果堆栈样本必须等待几个周期才能到达保险箱点,这意味着它发生在指令块的末尾,而不是中间。如果您检查样本,您仍然可以很好地了解正在发生的事情。

我希望剖析器作者能够意识到他们不需要为这些小事操心。更重要的是不要错过大事。

于 2013-07-24T18:08:21.697 回答