2015-04-06 11 views
5

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:

  1. Jak/gdzie ten stos zostać zainicjowane?
  2. 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.

+0

możliwe duplikat [Java domyślny rozmiar stosu] (http://stackoverflow.com/questions/20030120/java-default-stack-size) – ControlAltDel

+1

Spójrz na Throwables printStackTrace() – user489041

+0

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

Odpowiedz

0

Trochę pytania otwartego końca, oto moje zdanie:

  1. stosu nie powinna być statyczna - nie jeden stos za wątek, nie na program i wątki mogą być dodawane i usuwane podczas programu na dożywotni. Tak więc stosy muszą być również przydzielane dynamicznie.
  2. Stos Java może zostać przepełniony. Które mogą być różne od OOM, ale nie tak różne. Jeśli chodzi o to, co przechowywać w stosie - wybieram konfigurowalny przez użytkownika, ponieważ wymagania są bardzo różne, gdy pracuję w trybie rozwoju lub produkcji. Można również omówić możliwe ulepszenia zarządzania stosami, takie jak tail-call optimizations. Pozwoli to uniknąć przepełnień stosu, ale wpłynie na sposób w jaki kod zostanie zapisany.

W każdym razie, moje 2 ¢.

0

Nie przechowywałbym żadnych informacji śledzenia stosu w dowolnym miejscu, ponieważ jest on już zapisany w ramce stosu każdego wątku. Gdy śledzenie stosu jest wymagane (na przykład zgłaszany wyjątek), zbudowałem go z ramki stosu.

Problem polega na tym, że nie jestem pewien, czy rama stosu zawiera wszystkie informacje potrzebne do tego.

0

Wywołanie Thread.currentThread(). GetStackTrace() zwraca wartość StackElement [], którą można wydrukować w dzienniku.

+0

Nie sądzę, że o to właśnie pytał OP –

Powiązane problemy