daybreaksnow's diary

私を私と呼びたい

[Java]EXCEPTION_ACCESS_VIOLATIONが発生した場合の対応

Eclipse上でデバッガを使いステップ実行していたところ、アプリケーションが突然落ち、EXCEPTION_ACCESS_VIOLATIONが発生したのでログファイルを見ろと言われた。
指定されたログ(hs_err_pid4704.log)の内容は以下の通り。


ログの内容の抜粋

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d89a24f, pid=4704, tid=6756
#
# JRE version: 6.0_26-b03
# Java VM: Java HotSpot(TM) Client VM (20.1-b02 mixed mode windows-x86 )
...
VM Mutex/Monitor currently owned by a thread: None

Heap
 def new generation   total 45632K, used 4145K [0x046c0000, 0x07840000, 0x19c10000)
  eden space 40576K,   2% used [0x046c0000, 0x0479b738, 0x06e60000)
  from space 5056K,  64% used [0x07350000, 0x07680e40, 0x07840000)
  to   space 5056K,   0% used [0x06e60000, 0x06e60000, 0x07350000)
 tenured generation   total 100288K, used 68849K [0x19c10000, 0x1fe00000, 0x446c0000)
   the space 100288K,  68% used [0x19c10000, 0x1df4c650, 0x1df4c800, 0x1fe00000)
 compacting perm gen  total 37120K, used 36981K [0x446c0000, 0x46b00000, 0x486c0000)
   the space 37120K,  99% used [0x446c0000, 0x46add640, 0x46add800, 0x46b00000)
No shared spaces configured.
...


compacting perm genが99% usedとなっているので、このメモリ領域を使い切ったことが原因と推測した。
この領域はPermanent領域と呼ばれ、クラスやメソッドなどのメタ情報を保持する領域となっている。
Permanent領域は-Xmxでのメモリ割り当てでは領域が増えず、-XX:MaxPermSizeを指定することで最大値を変更できる。

今回は以下のVM引数を与えることで対応した。
-XX:MaxPermSize=128m

参考URL
http://www.atmarkit.co.jp/fjava/rensai3/devedge06/devedge06_2.html
http://d.hatena.ne.jp/sardine/20100716/p2