Zastanawiałem się, co się stanie, gdy spróbujesz złapać StackOverflowError i wymyśliłem następującą metodę:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
Teraz moje pytanie:
Dlaczego ta metoda drukuje „4”?
Pomyślałem, że może to dlatego, że System.out.println()
potrzebuje 3 segmentów na stosie wywołań, ale nie wiem, skąd pochodzi numer 3. Kiedy patrzysz na kod źródłowy (i kod bajtowy) programu System.out.println()
, zwykle prowadzi to do znacznie większej liczby wywołań metod niż 3 (więc 3 segmenty na stosie wywołań nie byłyby wystarczające). Jeśli jest to spowodowane optymalizacjami, które stosuje Hotspot VM (metoda inlining), zastanawiam się, czy wynik byłby inny na innej VM.
Edytować :
Ponieważ dane wyjściowe wydają się być wysoce specyficzne dla JVM, otrzymuję wynik 4 przy użyciu
środowiska Java (TM) SE Runtime Environment (kompilacja 1.6.0_41-b02
) 64-bitowa maszyna wirtualna serwera Java HotSpot (TM) (wersja 20.14-b01, tryb mieszany)
Wyjaśnienie, dlaczego uważam, że to pytanie różni się od Zrozumienia stosu Java :
Moje pytanie nie dotyczy tego, dlaczego jest cnt> 0 (oczywiście, ponieważ System.out.println()
wymaga rozmiaru stosu i rzuca inny, StackOverflowError
zanim coś zostanie wydrukowane), ale dlaczego ma szczególną wartość 4, odpowiednio 0,3,8,55 lub coś innego na innym systemy.
5
, 6
i 38
Java 1.7.0_10