О Java Переполнение стека VM - PullRequest
1 голос
/ 05 апреля 2020

Спасибо!

Я изучаю JVM и проверяю переполнение стека VM, обнаружил странное явление. Я вызываю метод рекурсивно двумя способами, но меня перепутали с результатом.

Параметры VM: -Xss108k -Xms10m -Xmx10m

public class T2 {
    private int stackLength = 1;
    public void stackLeak(){
        long[] a = new long[2000]; //define this array or not
        stackLength++;
        stackLeak();
    }

    public static void main(String[] args) {
        T2 oom = new T2();
        try{ //
            oom.stackLeak();
        } catch(Throwable e){
            System.out.println("stack length: " + oom.stackLength);
            e.printStackTrace();
        } finally{

        }
    }


}

Я повторял много раз, результаты почти одинаковые. Я думал, что массив сохранен в куче, это не повлияет на стек VM, но это имело место.

1 Ответ

1 голос
/ 05 апреля 2020

Распределение массива влияет на время выполнения программы. Чем дольше выполняется программа, тем больше шансов, что JIT-компилятор сработает, и программа продолжит выполнение в скомпилированном режиме.

Разница в глубине стека объясняется фоновой JIT-компиляцией. Подробнее см. в этом ответе .

Чтобы сделать справедливое сравнение, запустите JVM с выключенной компиляцией JIT: -Xint. В этом случае выделение массива сделает максимальную глубину рекурсии ожидаемым меньшим (поскольку для ссылки на массив будет использоваться еще один слот стека).

...