Niedawno miałem wywiad i poproszono mnie o zaprojektowanie/wdrożenie funkcji stacktrace. Oto, co wymyśliłem.Jak zaimplementować śledzenie stosu w przypadku awarii?
- Zachowaj stos, który zawiera wszystkie wywołania metod z głównego punktu wejścia do programu.
- Jeśli wystąpi błąd w dowolnym momencie wykonywania, zatrzymaj program i wydrukuj cały stos, wyskakując każdy element.
I wtedy dwa pytania:
- Jak/gdzie ten stos zostać zainicjowane?
- W jaki sposób zdecydujesz, ile danych powinien przechowywać stos, bez uruchamiania OOM? Dlaczego JVM nigdy nie uruchomi OOM z powodu stosu?
Na pierwsze pytanie, które powiedziałem, stos powinien być statyczny i powinien zostać zainicjowany na początku programu. Ale nie byłem pewien co do drugiego pytania. Próbowałem przeczytać, jak robi to JVM, ale było to trochę skomplikowane. Próbowałem użyć google do podstawowych implementacji, ale nie mogłem go znaleźć. Byłbym bardzo wdzięczny, gdyby ktoś po prostu wskazał mi właściwy kierunek, czego dokładnie powinienem szukać, aby odpowiedzieć na to pytanie.
możliwe duplikat [Java domyślny rozmiar stosu] (http://stackoverflow.com/questions/20030120/java-default-stack-size) – ControlAltDel
Spójrz na Throwables printStackTrace() – user489041
Niestety głosował zamknąć ale zdaję sobie sprawę, te dwa pytania nie są takie same. Możesz znaleźć wiele informacji na temat alokacji stosów przy pomocy tego pytania: http://stackoverflow.com/questions/20030120/java-default-stack-size – ControlAltDel