2010/06/04
ありえるえりあ勉強会でJVMを落とした話の続き
菅原さんが次のコードでJVMを落としたのが、ありえるえりあ勉強会の最大の見せ場でした。
public class CrashWithHeap { public static void main(String[] args) { Object[] o = null; for (;;) { o = new Object[] {o}; } } }
家のDebianでやってみました。落ちました。
コアファイルを吐いたのでgdbでスタックを見てみました。スタックの最後が以下のように延々と続いています。フルGCのマーク&スイープのマークフェーズで循環的な関数の再帰呼び出しが起きてスタックオーバーフローしたようです。
#0 0x062ff9d7 in objArrayKlass::oop_follow_contents () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #1 0x062e7360 in MarkSweep::mark_and_follow () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #2 0x062ff9dd in objArrayKlass::oop_follow_contents () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #3 0x062e7360 in MarkSweep::mark_and_follow () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #4 0x062ff9dd in objArrayKlass::oop_follow_contents () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #5 0x062e7360 in MarkSweep::mark_and_follow () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #6 0x062ff9dd in objArrayKlass::oop_follow_contents () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #7 0x062e7360 in MarkSweep::mark_and_follow () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #8 0x062ff9dd in objArrayKlass::oop_follow_contents () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #9 0x062e7360 in MarkSweep::mark_and_follow () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so #10 0x062ff9dd in objArrayKlass::oop_follow_contents () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so 以下、省略
完全にJVMのバグです。
http://bugs.sun.com で上記ふたつの関数名で検索して見つからないので、アリエルから報告した方が良さそうです。
ちなみにコールスタックの開始の方は以下のように始まります。
#12968 0x0638811b in Threads::oops_do () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so [snip] #12971 0x061d4871 in GenMarkSweep::mark_sweep_phase1 () from /usr/local/jdk1.6.0_03/jre/lib/i386/client/libjvm.so
OOP(ordinary object pointer)は初見でしたが、JVM内のポインタ表現の呼称のようです。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/jvm-bug/tbping