首页 > 解决方案 > Centos7 上的 JVM 崩溃

问题描述

我在 centos7 上运行一个码头服务器,它不断崩溃并出现以下错误

 # A fatal error has been detected by the Java Runtime Environment:
    #
    #  SIGSEGV (0xb) at pc=0x00007fdd323ee698, pid=79411, tid=0x00007fd05bdfd700
    #
    # JRE version: OpenJDK Runtime Environment (8.0_222-b10) (build 1.8.0_222-8u222-b10-1~14.04-b10)
    # Java VM: OpenJDK 64-Bit Server VM (25.222-b10 mixed mode linux-amd64 )
    # Problematic frame:
    # V  [libjvm.so+0x653698]
    #
    # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
    #
    # If you would like to submit a bug report, please visit:
    #   http://bugreport.java.com/bugreport/crash.jsp
    #

    ---------------  T H R E A D  ---------------

    Current thread (0x00007fd044001800):  JavaThread "cron4j::scheduler[875ca3d006f7a65e29bf90fc0000016fc6274c4c6286cd54]::executor[875ca3d006f7a65e293583000000016fc678c0816e4418c5]" [_thread_in_vm, id=93353, stack(0x00007fd05bcfd000,0x00007fd05bdfe000)]

    siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000000
Stack: [0x00007fd05bcfd000,0x00007fd05bdfe000],  sp=0x00007fd05bdfc4b0,  free space=1021k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x653698]
C  [libbCacheService.so+0x2068c]  JNIEnv_::GetObjectClass(_jobject*)+0x2e
C  [libbCacheService.so+0x1f400]  Java_com_applictaion_test_CacheService_buildCache+0x111
j  com.application.test.CacheService.buildCache([Lcom/application/test/db/CacheJNI;)V+0

相同的代码在 ubuntu 上运行良好。但是,它在 Centos 7 上一直失败。

我有

gcc --version
gcc (GCC) 9.2.0
java-1.8.0-openjdk-amd64 and jre1.8.0_65 same issue with both the JRE versions
Further more I use -XX:+UseParallelGC for GC.

正如人们所看到的,问题来自 libjvm.so JVM 环境,而不是应用程序问题。此外,在 Ubuntu 上相同的设置和代码运行良好,知道 Centos 7 发生了什么吗?

谢谢

拉吉

标签: javasegmentation-faultcentos7jvm-crashjnienv

解决方案


正如人们所看到的,问题来自 libjvm.so JVM 环境,而不是应用程序问题

否:问题很可能是libbCacheService.so,而不是libjvm.so。我不知道它的起源libbCacheService.so是什么,但鉴于谷歌只有在我搜索它时才找到这个问题,我怀疑它是你的应用程序。

此外,在 Ubuntu 上相同的设置和代码可以正常工作

这种情况经常发生:表现出未定义行为的应用程序在一个系统上“正常”运行,而在另一个系统上崩溃。

您的第一步应该是libbCacheService.so使用调试信息进行构建,启用核心转储,并从核心检查libjvm.so调用的任何函数是否JNIEnv_::GetObjectClass()使用正确的参数调用。

PS它看起来(来自si_addrlibjvm.so取消引用了一个NULL指针。可能是因为您将 NULL 指针作为参数之一传递给它。


推荐阅读