JVM 崩溃问题框架:Canonicalizer::do_If

sai*_*kar 1 crash jvm canonical-link

在启用热部署时,我始终面临JVM崩溃(在启动时使用以下java选项JAVA_OPTS -Xmx4096m -XX:MetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=crash -XX:ThreadStackSize=512 -XX:+UseConcMarkSweepGC -XX: ParallelGCThreads=5 -XX:NewRatio=2 -XX:+UnlockDiagnosticVMOptions -XX:-UseLoopPredicate -Xdebug -Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n -XX:NewRatio=2 -Dspringloaded.synchronize =true J​​AVA_OPTS=`echo $JAVA_OPTS -Dspringloaded.synchronize=true -javaagent:springloaded-1.2.1.jar -noverify )

环境:JDK 1.8 U 66、RHEL 6.7

    #
    # Java 运行时环境检测到致命错误:
    #
    # SIGSEGV (0xb) at pc=0x00007faee9a1e27c, pid=27208, tid=140379827795712
    #
    # JRE 版本:Java(TM) SE 运行时环境 (8.0_66-b17)(内部版本 1.8.0_66-b17)
    # Java VM:Java HotSpot(TM) 64 位服务器 VM(25.66-b17 混合模式 linux-amd64 )
    # 有问题的框架:
    # V [libjvm.so+0x35027c] Canonicalizer::do_If(If*)+0x1c
    #
    # 已写入核心转储。默认位置:core.27208
    #
    # 包含更多信息的错误报告文件保存为:
    # hs_err_pid27208.log
    # [计时器到期,中止...]

apa*_*gin 6

我注意到Java 选项列表中都有-javaagent和。-noverify

看起来springloaded代理生成了无效的字节码,而字节码验证已显式关闭。毫不奇怪,这可能会导致不可预测的结果,包括 JVM 崩溃。

这不是 JVM 问题,而很可能是springloaded代理中的错误。尝试删除-noverify选项。

-XX:-TieredCompilation也可以解决这个特定问题,但如果字节码无法通过验证,则不要指望应用程序能够正常工作。最好远离有缺陷的代理库。