我遇到的情况是我看不到VisualVM应用程序记录了某些方法调用而不是。想找出原因并碰到了这个answer on SO。第三点提到采样方法的潜在问题(这是我看到启用的唯一选项,可能是因为我正在执行远程分析)。它提到了代码中的安全点和代码本身的安全点轮询。这些术语是什么意思?
最佳答案
在Evaluating the Accuracy of Java Profilers (PLDI'10)中很好地讨论了Java采样探查器工具的不准确性问题及其与安全点的关系。
实质上,由于采样发生在安全点期间,因此Java探查器在采样时可能会产生不准确的结果。并且由于编译器可以修改安全点的出现,因此某些方法的执行可能永远不会由分析器对进行采样。因此,探查器计划记录代码示例(时间间隔到了),但它必须等待安全点的出现。而且由于安全点是由编译器来回移动,从未观察到理想的采样方法。
如前所述,安全点是代码中的事件或位置,编译器中断执行以执行某些内部VM代码(例如GC)。
安全点轮询是一种实现安全点或安全点触发器的方法。这意味着在正在执行的代码中,您定期检查标志以查看是否需要执行安全点,如果需要,则执行该操作(由于GC触发),线程被中断并执行安全点。参见例如GC safe-point (or safepoint) and safe-region