Jedynym sposobem, w jaki można zwolnić Class, jest to, że używany Classloader jest usuwany z pamięci. Oznacza to, że odniesienia do każdej klasy i samego modułu ładującego klasy muszą iść drogą dodo.
Jednym z możliwych rozwiązań problemu jest posiadanie modułu ładującego klasy dla każdego pliku jar i modułu ładującego klasy dla każdego serwera AppServers, który deleguje rzeczywiste ładowanie klas do określonych programów ładujących klasy Jar. W ten sposób możesz wskazać różne wersje pliku jar dla każdego serwera aplikacji.
Nie jest to jednak trywialne. Platforma OSGi stara się właśnie to zrobić, ponieważ każdy pakiet ma inny program ładujący klasy, a zależności są rozwiązywane przez platformę. Może dobrym rozwiązaniem byłoby przyjrzenie się temu.
Jeśli nie chcesz używać OSGI, jedną z możliwych implementacji może być użycie jednej instancji klasy JarClassloader dla każdego pliku JAR.
I utwórz nową klasę MultiClassloader, która rozszerza Classloader. Ta klasa wewnętrznie miałaby tablicę (lub Listę) JarClassloaders, aw metodzie defineClass () iterowałaby przez wszystkie wewnętrzne programy ładujące do momentu znalezienia definicji lub wyrzucenia wyjątku NoClassDefFoundException. Można udostępnić kilka metod akcesorów, aby dodać nowe elementy JarClassloaders do klasy. Istnieje kilka możliwych implementacji MultiClassLoadera w sieci, więc możesz nawet nie potrzebować pisać własnej.
Jeśli instalujesz MultiClassloader dla każdego połączenia z serwerem, w zasadzie możliwe jest, że każdy serwer używa innej wersji tej samej klasy.
Wykorzystałem pomysł MultiClassloader w projekcie, w którym klasy zawierające skrypty zdefiniowane przez użytkownika musiały być ładowane i wyładowywane z pamięci i działało całkiem dobrze.