JVM在java.util.zip.ZipFile.getEntry中崩溃

11

以下日志文件导致了JVM崩溃。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f60ddce2058, pid=117268, tid=140052313204480
#
# JRE version: Java(TM) SE Runtime Environment (7.0_51-b13) (build 1.7.0_51-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libzip.so+0x5058]  ZIP_GetEntry+0x78
#
# 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.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

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

Current thread (0x00007f5f4c01a800):  JavaThread "EJB default - 3" [_thread_in_native, id=117526, stack(0x00007f607850e000,0x00007f607860f000)]

siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x0000000000000278

Registers:
RAX=0x0000000000000000, RBX=0x00007f607860c3c0, RCX=0x0000003a4d2182a0, RDX=0x000000000000009e
RSP=0x00007f607860c370, RBP=0x00007f607860c3a0, RSI=0x00007f5fdc0060a1, RDI=0x0000000000000010
R8 =0x00000000000001e5, R9 =0x2e786176616a2f73, R10=0x6e6172742e6c6d78, R11=0x0000000741902898
R12=0x00007f5fdc006340, R13=0x00007f5f4c01a9e8, R14=0x0000000066c00f1d, R15=0x00007f607860c3c0
RIP=0x00007f60ddce2058, EFLAGS=0x0000000000010246, CSGSFS=0x0000000000000033, ERR=0x0000000000000004
  TRAPNO=0x000000000000000e

Top of Stack: (sp=0x00007f607860c370)
0x00007f607860c370:   000000387860c3a0 00007f607860c3c0
0x00007f607860c380:   0000000000000038 00007f5f4c01a9e8
0x00007f607860c390:   00007f607860c3c0 00007f607860c818
0x00007f607860c3a0:   00007f607860c800 00007f60ddce0eed
0x00007f607860c3b0:   01007f5f4c01b6d0 00007f5fdc006340
0x00007f607860c3c0:   464e492d4154454d 656369767265732f
0x00007f607860c3d0:   2e786176616a2f73 6e6172742e6c6d78
0x00007f607860c3e0:   72542e6d726f6673 656d726f66736e61
0x00007f607860c3f0:   79726f7463614672 00007f6078600000
0x00007f607860c400:   00007f5f4c01a9e8 0000000000000000
0x00007f607860c410:   00007f607860cc90 00007f60d5006233
0x00007f607860c420:   00007f60d5005310 00007f6000000000
0x00007f607860c430:   00007f607860cce0 00007f607860cc90
0x00007f607860c440:   00007f5f4c01a800 00007f5f4c00d970
0x00007f607860c450:   00007f5f4c01b690 00007f5f4c01b6e0
0x00007f607860c460:   00007f5f4c01ba78 00000000000003d8
0x00007f607860c470:   00007f607860da90 00000005402d81a0
0x00007f607860c480:   00007f60d256f5c0 00007f5f4c01b6d8
0x00007f607860c490:   00007f607860cc90 00007f5f4c01a800
0x00007f607860c4a0:   00007f5f4c01b6d0 00007f5f4c01b6d8
0x00007f607860c4b0:   00007f607860cc90 00007f5f4c01a800
0x00007f607860c4c0:   00007f5fa8003ac0 00007f5fa8003ac0
0x00007f607860c4d0:   00007f607860cd20 00007f60decc9d8d
0x00007f607860c4e0:   00007f607860c500 00007f607860cd30
0x00007f607860c4f0:   00007f5f4c01a9e8 0000000000000000
0x00007f607860c500:   00007f607860cd80 00007f60d5006233
0x00007f607860c510:   00007f60d5005310 00007f6000000000
0x00007f607860c520:   00007f607860cdd8 00007f607860cd80
0x00007f607860c530:   00007f5f4c01a800 00007f5f4c01a800
0x00007f607860c540:   00007f5fa8003ac0 00007f5fa8003ac0
0x00007f607860c550:   00007f5f4c01b6c8 00007f60decc9d8d
0x00007f607860c560:   00007f607860c580 0000000000000410 

Instructions: (pc=0x00007f60ddce2058)
0x00007f60ddce2038:   45 85 c0 0f 84 ff 00 00 00 44 89 f0 31 d2 41 f7
0x00007f60ddce2048:   b4 24 88 00 00 00 49 8b 84 24 80 00 00 00 89 d2
0x00007f60ddce2058:   8b 1c 90 0f 1f 44 00 00 4d 8b ac 24 98 00 00 00
0x00007f60ddce2068:   4d 85 ed 74 1e 49 8b 7d 00 4c 89 fe e8 cf d7 ff 

Register to memory mapping:

RAX=0x0000000000000000 is an unknown value
RBX=0x00007f607860c3c0 is pointing into the stack for thread: 0x00007f5f4c01a800
RCX=0x0000003a4d2182a0: <offset 0x2182a0> in /lib64/libpthread.so.0 at 0x0000003a4d000000
RDX=0x000000000000009e is an unknown value
RSP=0x00007f607860c370 is pointing into the stack for thread: 0x00007f5f4c01a800
RBP=0x00007f607860c3a0 is pointing into the stack for thread: 0x00007f5f4c01a800
RSI=0x00007f5fdc0060a1 is an unknown value
RDI=0x0000000000000010 is an unknown value
R8 =0x00000000000001e5 is an unknown value
R9 =0x2e786176616a2f73 is an unknown value
R10=0x6e6172742e6c6d78 is an unknown value
R11=0x0000000741902898 is an unknown value
R12=0x00007f5fdc006340 is an unknown value
R13=0x00007f5f4c01a9e8 is an unknown value
R14=0x0000000066c00f1d is an unknown value
R15=0x00007f607860c3c0 is pointing into the stack for thread: 0x00007f5f4c01a800


Stack: [0x00007f607850e000,0x00007f607860f000],  sp=0x00007f607860c370,  free space=1016k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libzip.so+0x5058]  ZIP_GetEntry+0x78
C  [libzip.so+0x3eed]  Java_java_util_zip_ZipFile_getEntry+0xad
J  java.util.zip.ZipFile.getEntry(J[BZ)J

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J  java.util.zip.ZipFile.getEntry(J[BZ)J
J  java.util.jar.JarFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;
J  org.jboss.modules.JarFileResourceLoader.getResource(Ljava/lang/String;)Lorg/jboss/modules/Resource;
J  org.jboss.modules.ModuleClassLoader.loadResourceLocal(Ljava/lang/String;)Ljava/util/List;
J  org.jboss.modules.Module.getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;

第一次出现这种情况时,根据我参考的一些在线资料(链接),我设置了JVM选项-Dsun.zip.disableMemoryMapping=true。但仍然发生了相同的JVM崩溃。
在各个地方都有很多类似的问题报告,但没有一个答案提供了这个问题的明确解决方案。
我已经阅读了以下帖子,但是我没有看到任何可能的解决方案。 在类加载期间进行memcpy时JVM崩溃 非常感谢您的帮助。

你尝试启用核心转储了吗? - while true
@whiletrue 是的,启用核心转储并不能解决这个问题。它只会启用包含更多调查信息的核心转储(崩溃转储)。它只是一个内存快照。 - Ruchira Gayan Ranaweera
如果问题是,当您尝试读取文件时,另一个进程正在操作该文件,那么您可以制作一个临时的ZIP文件副本,并从副本中进行读取。 - Andreas
“none of the answers provided a firm solution” - 解决方案不是在应用程序运行时修改应用程序JAR文件。 - apangin
@apangin 是的。但这不在我们的控制范围内。这就是问题所在。所有事情都发生在JVM层面上。你有没有更深入地挖掘一下?如果你这样做,你会看到这个问题是如何发生的以及为什么发生的。我也知道你提到的事实。 - Ruchira Gayan Ranaweera
@RuchiraGayanRanaweera 当访问文件时,某些JAR文件的内容会发生更改。当然,这会破坏ZIP结构,例如文件头中的偏移量变得无效。这不是JVM修改JAR文件。这是在外部完成的。因此,JVM对此无能为力。如果出现任何原因覆盖JAR文件,则应在部署/维护应用程序的方式或应用程序本身中进行修复。 - apangin
2个回答

12

问题是正在使用的zip/JAR文件被覆盖。 使用-Dsun.zip.disableMemoryMapping=true可以解决这个问题,您正在使用的是JDK7更新51,可用的JDK9早期版本已经提供了解决方案。

查看原始问题https://bugs.openjdk.java.net/browse/JDK-8142508,该问题已在JDK9早期版本Build 97中得到修复。


感谢您的帮助。根据我的帖子,-Dsun.zip.disableMemoryMapping=true并没有解决问题。 - Ruchira Gayan Ranaweera
我最近也遇到了同样的问题。崩溃是由于覆盖正在使用的JAR文件引起的。 - Corey
2
你是指覆盖(overwritten)吗?在IT上下文中,覆盖(overwrite)和重写(override)是具有不同含义的不同单词。(在普通英语中也是如此...) - Stephen C
你试过使用“-Dsun.zip.disableMemoryMapping=true”吗? - Fairoz
@ObiWan-PallavJha 我并没有解决这个问题,而是通过在复制新的jar文件之前终止Java程序来避免它。当新的jar文件被复制后,我重新启动Java程序。 - Corey

0

我们也遇到了同样的问题。这个问题只出现在特定的文件集上,而不是所有文件。它是由Java的本地方法引起的。因此,我们无法从代码中处理这个问题。更改配置也不能解决问题。所以这个问题的解决方案(至少在我的情况下)是:

  1. 创建shutdownhook线程
  2. 每当jvm崩溃时重新启动相同的jvm
  3. 跳过那些导致错误的zip文件并继续处理下一个文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接