Мне было интересно, что произойдет, когда вы попытаетесь поймать StackOverflowError и предложили следующий метод:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
Теперь мой вопрос:
Почему этот метод печатает '4'?
Я подумал, возможно, это потому, что System.out.println()
требуется 3 сегмента в стеке вызовов, но я не знаю, откуда приходит номер 3. Когда вы смотрите на исходный код (и байт-код) System.out.println()
, он обычно приведет к гораздо более сложным вызовам метода, чем 3 (так что 3 сегмента в стеке вызовов будет недостаточным). Если это связано с оптимизацией, применяемой Hotspot VM (метод inline), мне интересно, будет ли результат отличаться на другой VM.
Изменить
Поскольку вывод, кажется, очень специфичен JVM, я получаю результат 4, используя
Java (TM) SE Runtime Environment (сборка 1.6.0_41-b02)
Java HotSpot (TM) 64-разрядная серверная VM (сборка 20.14-b01, смешанный режим)
Объяснение, почему я думаю, что этот вопрос отличается от Понимание стека Java:
Мой вопрос не в том, почему существует cnt > 0 (очевидно, потому что System.out.println()
требует размера стека и бросает другой StackOverflowError
, прежде чем что-то будет напечатано), но почему оно имеет конкретное значение 4, соответственно 0,3, 8,55 или что-то еще в других системах.