标准JIT编译,而不是HotSpot中的栈上替换

时间:2019-05-15 20:46:34

标签: java java-8 jvm-hotspot

我试图在Java HotSpot VM中使用C1来查看标准JIT编译的结果,而不是OSR。我已使用-XX:-UseOnStackReplacement关闭OSR,并使用-XX:TieredStopAtLevel=1将编译限制为C1。但是现在我的方法根本没有被编译。我已打开“打印编译”,如果我允许它使用OSR,则可以很好地记录编译。同样,没有OSR的C1文件也没有碰到我的断点。

我正在使用一个非常简单的代码段进行测试

class Demo {
  public static void main(String[] args) {
      int a = workload();
    System.out.println("Calculated answer is: " + a);
  }

  private static int workload() {
    int a = 14;
    for (int i = 0; i<100000; i++) {
      a = a + i;
    }
    return a;
  }
}

1 个答案:

答案 0 :(得分:3)

问题在于您仅调用一次OKCupid.prototype.logout = function(){ request = request.defaults({jar: request.jar()}) // reset the cookie jar headers.clearOAuthToken(); // just in case } 并执行多次该循环;您不是多次执行workload;这是您在这里遇到的主要问题。 workload可以优化方法,但是这里只有一个循环-因此,除非JIT处于活动状态,否则没有太多要优化的东西。

这很容易证明,您可以使用以下方法运行方法:

OSR

在获得的输出中,您会看到很多-XX:+UnlockDiagnosticVMOptions -XX:TieredStopAtLevel=1 -XX:+TraceNMethodInstalls // this is to track the compiled methods -XX:-UseOnStackReplacement com.so.jit.OSRCompilation // this is the classname I've used

但是,如果您启用了Installing method

OSR

您将获得很多-XX:+UnlockDiagnosticVMOptions -XX:TieredStopAtLevel=1 -XX:+TraceNMethodInstalls // this is to track the compiled methods -XX:+UseOnStackReplacement com.so.jit.OSRCompilation // this is the classname I've used 一行:

Installing method