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

时间:2013-07-24 16:38:16

标签: java jvm profiling jvisualvm

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

2 个答案:

答案 0 :(得分:9)

Evaluating the Accuracy of Java Profilers (PLDI'10)中讨论了Java抽样分析器工具的不准确性及其与安全点的关系的问题。

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

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

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

答案 1 :(得分:6)

This blog post讨论安全点。 基本上它们是代码中的点,JITter允许中断GC,堆栈跟踪等。

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

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

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