JavaのStackOverflowError調査
Clojureとかのカラミで、Javaでどれだけ再帰できるか試してみた。
JVMのパラメタは以下の通り。
-Xms40m -Xmx256m
実行したJavaコードは以下の通り。
クラスメソッドとインスタンスメソッドそれぞれで調査。
Javaだとメソッド呼び出しの度にスタックフレームが作成されるので
どこかで頭打ちになるはず。
public class call { public static void main(String[] args) { // callable(0); (new call()).callable2(0); } public static void callable(int cnt) { cnt++; System.out.println("cnt[" + cnt + "]"); callable(cnt); } public void callable2(int cnt) { cnt++; System.out.println("cnt2[" + cnt + "]"); callable2(cnt); } }
結果。
cnt[5178] Exception in thread "main" java.lang.StackOverflowError cnt2[3139] Exception in thread "main" java.lang.StackOverflowError
インスタンスメソッドの方が、若干早くStackOverflowErrorが
発生するようだ。
これはインスタンスメソッドとクラスメソッドでは
メモリ上に配置されるエリアが違うからだと思う。
これもメソッド内でさらに他のオブジェクトのインスタンスを
生成すると変わりそうだけど。
あとはJVMに与えるメモリ容量とかにも影響されると思う。
両方とも3000くらいまでは呼び出しが可能なので
よっぽど深い再帰を連発しなければ、Javaでも再帰中心で
プログラム書けるんじゃないかな?