Мне было интересно, что происходит, когда вы пытаетесь поймать 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 (встраивание метода), мне интересно, будет ли результат отличаться на другой виртуальной машине.
Редактировать :
Поскольку результат, похоже, сильно зависит от JVM, я получаю результат 4 с использованием
Java (TM) SE Runtime Environment (сборка 1.6.0_41-b02
) 64-разрядной серверной виртуальной машины Java HotSpot (TM) (сборка 20.14-b01, смешанный режим)
Объяснение, почему я думаю, что этот вопрос отличается от понимания стека Java :
Мой вопрос не в том, почему существует cnt> 0 (очевидно, потому что System.out.println()
требуется размер стека и бросает другое, StackOverflowError
прежде чем что-то будет напечатано), а почему у него конкретное значение 4, соответственно 0,3,8,55 или что-то еще на другом системы.
5
, 6
и 38
с Java 1.7.0_10