-XX:StackYellowPages
に指定できる最小値は3(4kbページとして12kb)。
$ java -XX:StackYellowPages=1 Test1 intx StackYellowPages=1 is outside the allowed range [ 3 ... 8 ] Improperly specified VM option 'StackYellowPages=1' Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
ただ、Yellow Pagesを増やす必要のあるケースって何だろう? メソッド呼び出しでスタックの上に積めるのはメソッドの引数とローカル変数だけ(定数プールへの参照は微々たるもの)みたい。
なので、long型ローカル変数を3,000個用意したうえでスタックサイズを調節すれば12kbのページをぶっちぎってRed Pageに到達できるかと思って以下のようなプログラムを作ってみたんだけど、いずれも普通にjava.lang.StackOverflowError
が発生するんだよなぁ……
以下をPowerShellから138..150 | ForEach-Object { java -Xss"$_"k Test1 }
のようにして実行。
// javac -J-Xss4m Test1.java public class Test1 { public static void main(String args[]) { stackoverflow(1); } public static void stackoverflow(int i) { System.out.println(i); // & { $list = (1..5500); $list | ForEach-Object { "long i${_} = ${_};" }; "System.out.println(0"; $list | ForEach-Object { "+ i$_" }; ");" } | sv hoge; $hoge -join " " | Set-Clipboard long i1 = 1; long i2 = 2; long i3 = 3; long i4 = 4; long i5 = 5; long i6 = 6; long i7 = 7; ... stackoverflow(i+1); } }
PS C:\home\src> 138..150 | ForEach-Object { "■Xss:$_"; java -Xss"$_"k Test1 } ■Xss:138 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:139 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:140 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:141 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:142 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:143 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:144 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:145 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:146 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:147 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:148 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:149 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4) ■Xss:150 1 15127750 Exception in thread "main" java.lang.StackOverflowError at Test1.stackoverflow(Test1.java:11) at Test1.main(Test1.java:4)