除了java.lang.Compiler之外,有没有办法手动触发JIT

时间:2014-12-27 22:18:48

标签: java compiler-optimization jvm-hotspot

我正在尝试基于具有分析信息的方法结构(由JVM提供)构建JIT策略,但我无法手动触发JIT。 This documentation表示我可以通过调用java.lang.Compiler.compileClass()来运行JIT,但每次运行JVM时,方法都返回false,java.lang.Compiler检查的属性(java.compiler)为null。我试过OpenJDK和Oracle JVM 1.7的结果都是一样的。

然而,当我用

观察编译统计时
$ jstat -printcompilation <PID>

我可以看到JIT成功编译了一些符合条件的方法。

如果存在任何方式,我宁愿从java代码触发它。我也尝试在hotspot VM's code中搜索,但是我无法找到做出决定和JIT开始的类和方法。

编辑:在查看更多内容后,我发现compilationPolicy.cpp仍无法找到决定所依据的确切位置。我希望像(简单地思考)

if(hot_count > Threshold){
   compile_method(methodHandle);
}

但是找到了这个,

void SimpleCompPolicy::method_invocation_event(methodHandle m, JavaThread* thread) {
const int comp_level = CompLevel_highest_tier;
  const int hot_count = m->invocation_count();
  reset_counter_for_invocation_event(m);
  const char* comment = "count";

  if (is_compilation_enabled() && can_be_compiled(m)) {
    nmethod* nm = m->code();
    if (nm == NULL ) {
    // [MY COMMENT] no check being done on hot_count in here or callee methods
      CompileBroker::compile_method(m, InvocationEntryBci, comp_level, m, hot_count, comment, thread);
    }
  }
}

就跟踪本机JVM代码而言,即时脱离主题。 仍在寻找在代码的java方面使用的简单解决方案

1 个答案:

答案 0 :(得分:3)

听起来你想要类似于编译器控件功能(http://openjdk.java.net/jeps/165)。

不幸的是,它目前还不存在,尽管它目前已计划成为Java 9的一部分。