[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