Java 8个JIT线程好像陷入死循环
Java 8 JIT thread seems like falling into infinite loop
我在 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
是0x290
、0x2b1
、0x2a3
或 0x29f
。
C2 CompilerThread0
看起来像一个线程在做 JIT 编译,堆栈跟踪好像陷入了无限循环什么的。
我想知道这是否可能是 JVM 的 JIT 编译器的错误。如果是,我如何指定我的应用程序的哪个方法使 JVM 疯狂,我如何解决(或解决)这个问题?我尝试了 -XX:+PrintCompilation
选项,但它没有太大帮助,因为它没有显示哪个线程编译了哪个方法。
如果不是JVM的问题,是什么原因造成的?
看起来确实像一个 JIT 编译器错误,大概是在分配消除优化中。
尝试 运行 -XX:-EliminateAllocations
JVM 选项。
您还可以添加 -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation
以生成详细的编译日志,每个编译器线程都有一个单独的输出文件。
我在 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
是0x290
、0x2b1
、0x2a3
或 0x29f
。
C2 CompilerThread0
看起来像一个线程在做 JIT 编译,堆栈跟踪好像陷入了无限循环什么的。
我想知道这是否可能是 JVM 的 JIT 编译器的错误。如果是,我如何指定我的应用程序的哪个方法使 JVM 疯狂,我如何解决(或解决)这个问题?我尝试了 -XX:+PrintCompilation
选项,但它没有太大帮助,因为它没有显示哪个线程编译了哪个方法。
如果不是JVM的问题,是什么原因造成的?
看起来确实像一个 JIT 编译器错误,大概是在分配消除优化中。
尝试 运行 -XX:-EliminateAllocations
JVM 选项。
您还可以添加 -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation
以生成详细的编译日志,每个编译器线程都有一个单独的输出文件。