应用启动数分钟后JVM崩溃排查求助
问题
应用启动数分钟后JVM发生崩溃,该应用在其他机器上可正常运行。此应用使用javax.print API,是否可能是故障打印机DLL引发该问题?该如何解决?
已尝试增大Java堆空间,但JVM仍会崩溃。以下为崩溃日志:
# # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007fff089c997d, pid=424, tid=20976 # # JRE version: OpenJDK Runtime Environment AdoptOpenJDK (11.0.10+9) (build 11.0.10+9) # Java VM: OpenJDK 64-Bit Server VM AdoptOpenJDK (11.0.10+9, mixed mode, tiered, compressed oops, g1 gc, windows-amd64) # Problematic frame: # V [jvm.dll+0x2c997d] # # # If you would like to submit a bug report, please visit: # https://github.com/AdoptOpenJDK/openjdk-support/issues # --------------- S U M M A R Y ------------ Host: Intel(R) Xeon(R) Platinum 8253 CPU @ 2.20GHz, 4 cores, 7G, Windows Server 2012 R2 , 64 bit Build 9600 (6.3.9600.20625) Time: Fri Nov 11 08:13:53 2022 Central Standard Time elapsed time: 98.393674 seconds (0d 0h 1m 38s) --------------- T H R E A D --------------- Current thread (0x000000f2716a2800): GCTaskThread "GC Thread#3" [stack: 0x000000f273d80000,0x000000f273e80000] [id=20976] Stack: [0x000000f273d80000,0x000000f273e80000], sp=0x000000f273e7ded0, free space=1015k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [jvm.dll+0x2c997d] V [jvm.dll+0x73e694] V [jvm.dll+0x65856d] V [jvm.dll+0x73efcc] V [jvm.dll+0x6595c4] V [jvm.dll+0x7a9490] V [jvm.dll+0x739ba4] V [jvm.dll+0x5f2466] C [ucrtbase.DLL+0x1c1ae] C [KERNEL32.DLL+0x13d2] C [ntdll.dll+0x15504] siginfo: EXCEPTION_ACCESS_VIOLATION (0xc0000005), reading address 0x0000000000000000
分析与解决方案
是否由故障打印机DLL引发?
有可能,但从当前崩溃日志来看,崩溃发生在GC线程(GC Thread#3),问题帧指向jvm.dll,并非直接的打印机相关DLL。不过,javax.print API会调用系统本地打印机驱动DLL,若这些DLL存在内存泄漏、野指针或兼容性问题,可能间接破坏JVM的内存结构,导致GC过程中出现访问违规(读取空地址0x0000000000000000)。
解决步骤
- 排查打印机环境差异:对比故障机器与正常机器的打印机配置,重点检查:
- 默认打印机是否存在、驱动是否为最新且兼容Windows Server 2012 R2;
- 是否有故障/离线打印机被应用代码调用;
- 尝试暂时禁用所有打印机,或切换到一个已知正常的打印机驱动,验证崩溃是否消失。
- 隔离打印模块影响:在代码中临时禁用所有打印相关逻辑,若崩溃不再发生,则可确定问题出在打印模块。再逐步恢复打印操作,定位具体是哪个打印任务、打印机型号或参数导致的问题。
- 升级JVM版本:当前使用的AdoptOpenJDK 11.0.10可能存在与Windows Server 2012 R2或打印API相关的已知bug,尝试升级到AdoptOpenJDK 11的最新小版本,修复潜在的兼容性问题。
- 收集更详细的崩溃信息:添加JVM启动参数
-XX:+CreateMinidumpOnCrash,生成崩溃时的核心转储文件,通过调试工具分析转储,确认崩溃是否与打印机DLL的调用链相关。 - 检查系统资源:尽管已增大堆空间,但需确认系统物理内存、虚拟内存是否充足——打印操作可能占用大量本地内存,导致JVM的GC机制无法正常工作。
内容的提问来源于stack exchange,提问作者Yatharth Mishra
相关产品推荐
相关产品推荐

