Java 8 JIT线程似乎陷入无限循环

时间:2015-01-28 15:36:04

标签: java jvm java-8 jit

我在Java 8中编写了一个服务器应用程序,并使用java 1.8.0u25运行它。

在最初的几个小时内工作正常,但在获得大约5k~10k的请求后,VM进程的一个线程使用其中一个CPU的100%。

所以我尝试jstack让VM进程检查有问题的线程是什么,并且它显示线程(线程ID是14303 = 0x37df)是“C2 CompilerThread0”:

"C2 CompilerThread0" #6 daemon prio=9 os_prio=0 tid=0x00002aaabc12a000 nid=0x37df runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

使用jstack -m,线程的堆栈跟踪如下:

----------------- 14303 -----------------
0x00002b99b67693c3  _ZN16PhaseMacroExpand27process_users_of_allocationEP8CallNode + 0x2a3
0x00002b99b676ec3b  _ZN16PhaseMacroExpand23eliminate_allocate_nodeEP12AllocateNode + 0x1cb
0x00002b99b676ee65  _ZN16PhaseMacroExpand21eliminate_macro_nodesEv + 0x1a5
0x00002b99b6772769  _ZN16PhaseMacroExpand18expand_macro_nodesEv + 0x19
0x00002b99b640b01b  _ZN7Compile8OptimizeEv + 0xa6b
0x00002b99b640c53c  _ZN7CompileC1EP5ciEnvP10C2CompilerP8ciMethodibbb + 0x13bc
0x00002b99b635f9c8  _ZN10C2Compiler14compile_methodEP5ciEnvP8ciMethodi + 0x198
0x00002b99b6414c6a  _ZN13CompileBroker25invoke_compiler_on_methodEP11CompileTask + 0xc8a
0x00002b99b6417650  _ZN13CompileBroker20compiler_thread_loopEv + 0x620
0x00002b99b69a2e8f  _ZN10JavaThread17thread_main_innerEv + 0xdf
0x00002b99b69a2fbc  _ZN10JavaThread3runEv + 0x11c
0x00002b99b6860d48  _ZL10java_startP6Thread + 0x108

每次我尝试jstack -m时,此线程的堆栈跟踪都是相同的,但堆栈顶部_ZN16PhaseMacroExpand27process_users_of_allocationEP8CallNode的方法(程序计数器?)旁边的数字是{{ 1}},0x2900x2b10x2a3

0x29f看起来像一个执行JIT编译的线程,并且堆栈跟踪似乎陷入无限循环或其他什么。

我想知道这是否是JVM的JIT编译器的错误。如果是,我如何指定我的应用程序的哪个方法使JVM疯狂,我该如何解决(或解决)这个问题?我尝试了C2 CompilerThread0选项,但它没有多大帮助,因为它没有显示哪个线程编译了哪个方法。 如果它不是JVM的问题,那会发生什么呢?

1 个答案:

答案 0 :(得分:6)

它确实看起来像JIT编译器错误,可能是在分配消除优化中 尝试使用-XX:-EliminateAllocations JVM选项运行。

您还可以添加-XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation以生成详细的编译日志,每个编译器线程都有一个单独的输出文件。