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でも再帰中心で
プログラム書けるんじゃないかな?