在分析的背景下,什么是安全点和安全点轮询?

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

Java Sample Profiler工具的不准确性问题及其与安全点的关系在评估Java Profilers的准确性(PLDI’10)中得到了很好的讨论。

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

正如之前的anwer所解释的,安全点是代码中的事件或位置,其中编译器中断执行以执行某些内部VM代码(例如GC)。

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

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

该post还说,通过延迟堆栈样本,安全点不会出现在您可能喜欢的地方,这是一个问题。

在我看来,这是一个小问题。 你采取堆栈样本(而不仅仅是程序计数器样本)的全部原因是向你展示导致当前状态的所有呼叫站点,因为这些可能比任何程序都要慢得多。专柜正在做。 (如果它正在做任何事情。你可能处于I / O的中间,PC没有意义,但是呼叫站点仍然同样重要。)如果堆栈样本必须等待几个周期才能达到安全一点,这意味着它发生在指令块的末尾,而不是在中间。 如果您检查样本,您仍然可以清楚地知道发生了什么。

我希望剖析作家能够意识到他们不需要为这些小东西出汗。 更重要的是不要错过重要的东西。