【问题标题】:Java 8 JIT thread seems like falling into infinite loopJava 8 JIT 线程似乎陷入无限循环
【发布时间】:2015-03-27 14:06:36
【问题描述】:

我用 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_allocationEP8CallNode0x290,@987654328 @、0x2a30x29f

C2 CompilerThread0 看起来像是一个线程在做 JIT 编译,而堆栈跟踪似乎陷入了无限循环之类的东西。

我想知道这是否可能是 JVM 的 JIT 编译器的错误。如果是,我如何指定我的应用程序的哪种方法使 JVM 发疯,我该如何解决(或解决)这个问题?我尝试了-XX:+PrintCompilation 选项,但它并没有太大帮助,因为它没有显示哪个线程编译了哪个方法。 如果不是 JVM 的问题,那是什么原因造成的呢?

【问题讨论】:

  • 这似乎属于逃逸分析,因此通过-XX:-DoEscapeAnalysis 禁用它可能会修复问题。可以选择-XX:+PrintEliminateAllocations 来查看其效果,但是,它需要 JVM 的调试版本。
  • 如果是错误,我建议尝试 Java 8 update 31 或 update 40,因为这可能已经修复。
  • 我按照@PeterLawrey 的建议尝试了 Java 8 u31,但同样的问题再次发生......
  • 您是否有可重现的 sn-p 或跟踪错误编号,并且 8 的 51 次要版本是否修复了它?
  • @PeterLawrey 您是否知道此处描述的问题是否实际已提交并已修复?我尝试搜索 jdk bug tracker,但没有找到与此处描述的症状直接对应的内容。

标签: java jvm java-8 jit


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 2015-07-02
    • 2017-05-19
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多