Javaが突然死してSIGSEGV (0xb)が発生する件について

alkoshikawa 4,712views 更新:2014年1月8日

Linuxの環境によっては、ある時Javaのプロセスが突然落ちるときがあります。
原因はいろいろあるようですが、今回は「[libzip.so+0x77e3]」が出た場合のことです。

Tomcatのcatalina.outに

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fde3c1ac7d0, pid=29119, tid=140592066631424
#
# JRE version: 6.0_45-b06
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.45-b01 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libzip.so+0x77d0]
[error occurred during error reporting (printing problematic frame), id 0xb]

# An error report file with more information is saved as:
# /root/hs_err_pid29119.log
[thread 140592114140928 also had an error]
[thread 140592065332992 also had an error]
# [ timer expired, abort... ]

こんな内容が出て、
「/root/hs_err_pid29119.log」にエラーログが吐き出されます。
中を見てみると

Stack: [0x00007fc704465000,0x00007fc704566000],  sp=0x00007fc704561170,  free space=1008k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libzip.so+0x77e3]  char+0xa3

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  java.util.zip.Deflater.deflateBytes(J[BII)I+0
J  java.util.zip.DeflaterOutputStream.write([BII)V
j  java.util.zip.GZIPOutputStream.write([BII)V+4
j  org.apache.coyote.http11.filters.FlushableGZIPOutputStream.flushLastByte()V+19
j  org.apache.coyote.http11.filters.FlushableGZIPOutputStream.flush()V+26
j  org.apache.coyote.http11.filters.GzipOutputFilter.flush()V+32
j  org.apache.coyote.http11.InternalOutputBuffer.flush()V+92
j  org.apache.coyote.http11.Http11Processor.action(Lorg/apache/coyote/ActionCode;Ljava/lang/Object;)V+104
j  org.apache.coyote.Response.action(Lorg/apache/coyote/ActionCode;Ljava/lang/Object;)V+31
j  org.apache.catalina.connector.OutputBuffer.doFlush(Z)V+80
j  org.apache.catalina.connector.OutputBuffer.flush()V+2
j  org.apache.catalina.connector.CoyoteWriter.flush()V+12

こんな内容がありました。
原因としてはjniでエラーが出て死んだ形だと思われますが、要するにGzipを使うと死ぬということのようです。

http://stackoverflow.com/questions/8405641/jvm-crashes-at-libzip-so
ここらへんを見るとGzipをJGlibに差し替えればOKといったことも書いてあります。

このケースはTomcatでレスポンスをGzip圧縮をして返すようにしていたのでそこを外すことで問題が出なくなると思いますが、
フレームワークなどで使用されているところで死んだ場合は結構メンドそうです。
サーバー環境をいじれるのであれば最新のJava7にする、zlib-develを最新にするなどを試す価値はあるかと思います。

 

ログイン / 新規登録してコメントする

このソースコードをストックして後で利用したり、作業に利用したソースコードをまとめることができます。

こちらもお役に立つかもしれません