我正在尝试基于具有分析信息的方法结构(由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方面使用的简单解决方案。
答案 0 :(得分:3)
听起来你想要类似于编译器控件功能(http://openjdk.java.net/jeps/165)。
不幸的是,它目前还不存在,尽管它目前已计划成为Java 9的一部分。