Tworzymy wiele podrzędnych programów ładujących klasy w celu załadowania wielu podrzędnych aplikacji do kontenera aplikacji Java, prototypując szybkie wdrażanie. Kiedy zmieniła się ścieżka klas określonego programu ładującego klasy (tj. Dodano słoiki, usunięto, zaktualizowano), stary program ładujący klasy jest wyrzucany (bez odniesień), a nowy program ładujący klasy jest tworzony dla nowej ścieżki klas słojów.Kiedy i jak jest oznaczany program ładujący klasy java do zbierania śmieci?
Po zaktualizowaniu ścieżki klas, uruchamiając instalację na gorąco, zrobiliśmy zrzut sterty. Zrzut sterty (za pomocą narzędzia Memory Analyzer) wskazuje, że stare programy ładujące klasy nie były gromadzone podczas zbierania śmieci. Niektóre klasy w nadrzędnym programie ładującym klasy buforowały stare programy ładujące klasy. Następujące rzeczy były powoływane w celu usunięcia tych buforów:
java.lang.ResourceBundle.clearCache(classLoader);
org.apache.commons.logging.LogFactory.release(classLoader);
java.beans.Introspector.flushCaches();
Nawet po usunięciu powyższe bufory, stare classloader wciąż nie są zbierane śmieci. Pozostałe odniesienia do classloader obejmował następujące:
- klas załadowane przez classloader
- java.lang.Package stworzonej przez samą classloader
- java.lang.ProtectionDomain stworzony przez classloader samego
Wszystkie powyższe są odwołaniami cyklicznymi wewnątrz programu ładującego klasy, które powinny wywołać wyrzucanie elementów. Nie jestem pewien, dlaczego tak nie jest. Czy ktokolwiek wie, dlaczego stare programy ładujące klasy nadal nie są zbierane nawet przy odwołaniach cyklicznych?
Którą maszynę JVM używasz (dokładna wersja)? Czy używasz dowolnej opcji maszyny JVM, która może wpływać na ładowanie klas? Czy używasz jakichkolwiek rzeczy z własnych implementacji Sun? Czy aplikacja manipuluje bajtem kodu? ... Jakie środowisko może mieć wpływ na ładowanie klas? – cafebabe
Nie ma związku z głównym pytaniem, ale czy uważasz, że coś w stylu OSGi zamiast tworzyć własne środowisko obsługujące szybkie wdrażanie? – SteveD
@bfoo W naszych testach używamy środowiska Java 6. Brak opcji JVM.W najprostszym przypadku nie korzystamy z impetu firmy Sun. Bez manipulowania bajtowym kodem. – onejigtwojig