当前位置: 首页 > 面试题库 >

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

翟青青
2023-03-14
问题内容

我用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_allocationEP8CallNode0x2900x2b10x2a3,或0x29f

C2 CompilerThread0 看起来像是一个执行JIT编译的线程,并且堆栈跟踪看起来像陷入了无限循环之类。

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


问题答案:

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

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



 类似资料:
  • 问题内容: 我有一段简单的代码,该代码 应该 是一个无休止的循环,因为它将一直在增长,并且始终会比更大。 但实际上,它可以打印并且不会无限循环。我不知道为什么。但是,当我以以下方式调整代码时: 这变成一个无尽的循环,我不知道为什么。java是否会识别出一个无穷循环并在第一种情况下跳过它,而在第二种情况下必须执行一个方法调用,以使其表现出预期的效果?困惑:) 问题答案: 这两个例子并不是无止境的。

  • 我已经写了这个生产者/消费者问题解决方案。它似乎在工作,而不是无限循环。我的印象是,pthread\u exit(NULL) 会让它停止,但老实说,我已经迷路了。有人能告诉我如何阻止循环的正确方向吗?

  • 如果我想在没有尾字段的情况下实现我的LinkedList add方法,它有什么问题? 下面是类: 编辑:将打印方法更改为:public void print(){Node currNode=head; 我得到的结果是:

  • 问题内容: 我是AngularJS的新手,我正在构建一个示例应用程序。我想在网页上显示Google Maps响应的结果。在这里,我传递了示例值,但是页面进入循环并给出此错误: 这是HTML页面: 问题答案: 在插值内调用函数时,请务必小心。插值会在 每个摘要循环中 运行,并且您在其中调用一个函数,一切都很好,但是随后在该函数中进行一次调用,该调用再次 触发摘要循环(在解析/拒绝和每个promise

  • 问题内容: 我正在尝试在我正在处理的Python项目中使用线程,但是线程似乎没有按照我的代码的预期运行。似乎所有线程都按顺序运行(即,线程2在线程1结束后开始,它们不是同时启动)。我编写了一个简单的脚本来对此进行测试,并且该脚本也按顺序运行线程。 这是我从运行它得到的输出: 循环的迭代次数更多时,观察到相同的行为。 我尝试搜索网络和较早的SO答案,但找不到任何有帮助的方法。有人可以指出这段代码有什

  • 问题内容: 我正在比较测试程序上的两个变体。两者都在具有四个内核的计算机上以4线程运行。 在“模式1”下,我非常类似于执行程序服务来使用池。我把一堆任务扔了进去。与普通的固定线程执行器服务相比,我获得了更好的性能(即使有对Lucene的调用,该调用在其中执行了一些I / O)。 这里没有分而治之。从字面上看,我知道 在“模式2”中,我向池提交一个任务,然后在该任务中调用ForkJoinTask.i