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

Gee*_*eek 15 java profiling jvm jvisualvm

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

Ale*_*leš 10

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

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

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

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


Mik*_*vey 6

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

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

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

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