什么是分析上下文中的安全点和安全点轮询?
我面临的情况是,我没有看到 VisualVM 应用程序未记录某些方法调用。想找出原因,并在SO上遇到这个答案。第三点提到了采样方法的潜在问题(这是我看到的唯一启用选项,可能是因为我正在做远程分析)。它提到了代码中的安全点和代码本身的安全点轮询。这些术语是什么意思?
我面临的情况是,我没有看到 VisualVM 应用程序未记录某些方法调用。想找出原因,并在SO上遇到这个答案。第三点提到了采样方法的潜在问题(这是我看到的唯一启用选项,可能是因为我正在做远程分析)。它提到了代码中的安全点和代码本身的安全点轮询。这些术语是什么意思?
Java采样探查器工具的不准确性问题及其与安全点的关系在评估Java探查器的准确性(PLDI'10)中得到了很好的讨论。
从本质上讲,Java 探查器在采样时可能会产生不准确的结果,因为采样发生在安全点期间。由于安全点的出现可以由编译器修改,因此某些方法的执行可能永远不会通过探查器采样。因此,探查器计划记录代码示例(时间间隔已结束),但它必须等待安全点的出现。由于安全点是由编译器移动的,因此从未遵守过理想采样的方法。
正如前面的 anwer 已经解释的那样,安全点是代码中的一个事件或位置,编译器中断执行以执行某些内部 VM 代码(例如 GC)。
安全点轮询是实现安全点或安全点触发器的方法。这意味着在执行的代码中,您定期检查一个标志以查看是否需要安全点执行,如果是(例如由于GC触发器),线程被中断并执行安全点。例如,参见GC安全点(或安全点)和安全区域
这篇博客文章讨论了安全点。基本上,它们是代码中JITter允许GC,堆栈跟踪等中断的点。
该帖子还表示,通过延迟堆栈样本,安全点不会出现在您可能希望的地方,这是一个问题。
在我看来,这是一个小问题。您获取堆栈样本(而不仅仅是程序计数器样本)的全部原因是向您展示导致当前状态的所有调用站点,因为这些站点可能比程序计数器正在执行的操作更有趣。(如果它正在做任何事情。您可能处于I / O的中间,PC毫无意义,但呼叫站点仍然同样重要。如果堆栈样本必须等待几个周期才能到达安全点,那么这意味着它发生在指令块的末尾,而不是中间。如果您检查示例,您仍然可以很好地了解发生了什么。
我希望分析器的作者们能够意识到他们不需要为小事出汗。更重要的是不要错过大事。