Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

JavaVMのスタックのガードページ幅を変更する必要性

luozengbin.github.io

pangin.pro

-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を増やす必要のあるケースって何だろう? メソッド呼び出しでスタックの上に積めるのはメソッドの引数とローカル変数だけ(定数プールへの参照は微々たるもの)みたい。

docs.oracle.com

なので、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)