信创环境麒麟系统Ky10运行openjdk,进程频繁崩溃该如何解决?

a系统内核:4.19.90-25.19.v2101.ky10.aarch64
java版本:OpenJDK Runtime Enviroment Bisheng (build 1.8.0_292-b10)
前提:Java代码在windows开发环境能正常稳定运行,并且在压测压力下没有崩溃过。
问题:在信创环境运行java进程,频繁遇到进程崩溃问题,在服务压力小时也偶尔崩溃,服务压力大时频繁崩溃。并且无法稳定复现,有时几分钟就崩溃了,有时好几天才崩溃一次。
崩溃日志:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x0000fffd8c020d28, pid=171524, tid=0x0000fffcf17bf1e0
#
# JRE version: OpenJDK Runtime Environment (8.0_292-b10) (build 1.8.0_292-b10)
# Java VM: OpenJDK 64-Bit Server VM (25.292-b10 mixed mode linux-aarch64 compressed oops)
# Problematic frame:
# j  sun.nio.ch.IOUtil.read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I+1
#
# Core dump written. Default location: /home/rmms/core or core.171524
#
# If you would like to submit a bug report, please visit:
#   https://gitee.com/src-openeuler/openjdk-1.8.0/issues/
#

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

Current thread (0x0000fffcfc029800):  JavaThread "reactor-http-nio-4" daemon [_thread_in_Java, id=171941, stack(0x0000fffcf15c0000,0x0000fffcf17c0000)]

siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x000000077b1784c0

期望解决:能通过什么方式排查进程崩溃的原因?并且由于生产环境原因,如果是兼容问题,需要出示问题分析报告才能升级JDK,所以未尝试使用新版本openjdk进行测试。

PS:目前观察所有的崩溃日志,导致崩溃的原因各种各样,有nio线程导致的,有GC线程导致的,甚至有线程执行CurrentHashMap.get()方法导致的,不过各种原因导致的崩溃,signinfo中的si_signo都是SIGSEGV

讨论数量: 7

你的openjdk是麒麟系统Ky10提供的吗

5个月前 评论
ice_cream_ (楼主) 4个月前
加了sugar (作者) 4个月前
加了sugar (作者) 4个月前

从你提供的崩溃日志来看,崩溃的原因是发生了SIGSEGV(信号11),这通常表示发生了段错误(segmentation fault),即程序试图访问它没有权限访问的内存区域。具体到这个崩溃日志,有几个关键信息点:

  1. 崩溃位置 :

    j sun.nio.ch.IOUtil.read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;JLsun/nio/ch/NativeDispatcher;)I+1

    这表明崩溃发生在sun.nio.ch.IOUtil.read方法中,这是Java NIO包中用于底层I/O操作的一个方法。这通常与文件I/O操作有关。

  2. 崩溃信号 :

    siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x000000077b1784c0

    si_code: 1 (SEGV_MAPERR) 表示访问了无效的内存地址,si_addr给出了出错时试图访问的内存地址。

  3. 线程信息 :

    Current thread (0x0000fffcfc029800): JavaThread "reactor-http-nio-4" daemon [_thread_in_Java, id=171941, stack(0x0000fffcf15c0000,0x0000fffcf17c0000)]

    这表明崩溃发生在名为reactor-http-nio-4的线程中,这是一个与Netty的HTTP NIO事件循环相关的线程。 可能的原因分析:

  • 文件I/O操作错误 :可能在进行文件读取操作时,试图访问了未被正确映射或已经关闭的文件描述符。

  • 资源泄露 :长时间运行的程序如果没有正确管理资源(如文件描述符),可能会导致资源泄露,最终导致无法访问某些内存区域。

  • 第三方库问题 :由于崩溃发生在Netty的HTTP NIO事件循环线程中,可能是Netty库的某个版本与当前JDK版本存在兼容性问题。 解决建议:

  • 检查代码 :审查涉及文件I/O操作的代码,确保所有资源(如文件描述符)在使用完毕后都被正确关闭。

  • 资源管理 :确保程序中对资源的管理是正确的,特别是对于长时间运行的程序,要避免资源泄露。

  • 更新和测试 :如果可能,尝试更新Netty库到最新版本,并在开发或测试环境中进行压力测试,以查看问题是否仍然存在。

  • 查看Netty文档和社区 :查看Netty的官方文档和社区,看是否有其他用户报告了类似的问题,并寻找可能的解决方案。

由于崩溃发生在特定的线程和方法中,这可能需要对代码和使用的库进行深入的审查和测试。

5个月前 评论
deatil 5个月前
ice_cream_ (楼主) 4个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!