Przeczytałem wiele artykułów, jak działa finalizator. Oto moje zrozumienie: Jeśli klasa sfinalizuje zaimplementowaną metodę, Jvm stworzy instancję Finalizera jako psa obserwującego na tym obiekcie.Sfinalizowane zawiera dużo pamięci 2,5 gig na 4 g
Po uruchomieniu GC oznaczałoby to, że obiekt ma zostać usunięty i dodał je do kolejki referencyjnej, a następnie wątek finalizatora wybierałby te obiekty z kolejki i wykonywał ich metodę końcową.
Moje pytanie brzmi: Jak znaleźć obiekt ze zrzutu sterty, którego metoda finalizacji nie została zakończona z jakiegoś powodu i zaczęła układać kolejkę odniesienia?
Czy kolejka referencyjna jest w określonej kolejności?
prostu zastanawiasz: jakie są Twoje sposoby finalizatora robi? Dlaczego masz tak wiele obiektów, które chcą użyć metody, na której, przynajmniej teoretycznie, nikt nie powinien polegać? – GhostCat
Z kodu źródłowego wydaje się, że ReferenceQueue działa jak lista - zawiera obiekty referencyjne, każda referencja odnosi się do następnej referencji. Może pierwszy obiekt jest tym, czego potrzebujesz. Może powinieneś spróbować dodać aspekt przy sfinalizowaniu metody i dodać trochę rejestrowania (np. Wywołanie Finalizuj dla xxx; Finalizacja zakończona) - ostatni wpis w wierszu wskaże obiekt, który został rozpoczęty do sfinalizowania, ale finalizacja nie została zakończona . – ekaerovets
Prawdopodobnie pójdę w drugą stronę i wykonam wyszukiwanie tekstowe dla klas, które mają nietrywialne implementacje 'finalize()' - czy w twojej bazie kodów jest zbyt wielu kandydatów? – Hulk