Przez "zwolniony" mam na myśli to, że nie ma żadnych odniesień do pozostałego modułu ładującego klasy.Kiedy sfinalizowanie jest wywoływane w pojedynczych egzemplarzach po zwolnieniu programu ładującego klasy?
Występuje problem polegający na tym, że często ponownie wdrażana aplikacja Java EE zjada przestrzeń permgen. Analiza pokazuje, że singleton w aplikacji Java EE przekazał odniesienia do obiektów klasy aplikacji ładujących poza aplikacją (z naruszeniem zasad Java EE) i nie usuwa ich po uruchomieniu aplikacji.
Zakładając, że nie ma innych odniesień do singletonu lub obiektu klasy, czy wywołanie singleton's finalize() zostanie wywołane, gdy zwolni się moduł ładujący klasy tej klasy? Chciałbym usunąć tam fałszywe referencje. Czy jestem w haczyku-22, w którym finalizacja nie zostanie wywołana, dopóki sam program ładujący klasy nie będzie mógł zostać zebrany - a zatem nigdy nie zostanie wywołany z powodu fałszywych zewnętrznych odniesień?
Głównym pytaniem jest chyba tutaj:
będzie obiektem klasy być śmieci zgromadzone w tym przypadku, gdy jego classloader nie można jeszcze? Może to być zależne od specyfikacji zachowania modułu ładującego lub może być zależne od implementacji.
Referencje (inny rodzaj! ;-)) byłyby docenione, ale nie są konieczne.
Jeśli zdasz referencje ClassLoaders rozważyć użycie WeakReference (y) i WeakHashMap zamiast silnych (regularny) referencje. – Stefan