Czy nadal jest tak, że Android nigdy nie rozładowuje klas?

Mamy dużą aplikację, która zawsze działa z limitem liczenia metod Dread. Zostałem poproszony o wymyślenie sposobu, aby pozwolić mu zrobić znacznie więcej, w tym obsługi wtyczek. Szukając sposobów wyładowania kodu, natknąłem sięPorady JNI który mówi

Klasy są rozładowywane tylko wtedy, gdy wszystkie klasy powiązane z ClassLoader mogą być zbierane bezużytecznie, co jest rzadkie, ale nie będzie niemożliwe w Androidzie.

Wydawało się to sugerować, że wtyczka może zostać rozładowana, jeśli, powiedzmy,

użyj nowegoDexClassLoader dla każdego pliku .jar,zawsze odwołuj się do wtyczki poprzez odniesienie do interfejsu ipo zakończeniu usuń wszelkie kopie odniesienia do tego interfejsu.

Więc stworzyłem przypadek testowy:

Stworzyłem kilka trywialnych wtyczek, używając dla każdego unikalnego programu ładującego.StworzyłemReferenceQueue<ClassLoader> i stworzyłem słabe odniesienia do moich dwóch programów ładujących, używając tej kolejki; Stworzyłem / uruchomiłem wątek, który zapętla się w nieskończoność, wykonując kolejkę.remove() i raportowanie.Podobnie stworzyłemReferenceQueue<Class<?>> i stworzył słabe odniesienia do każdej wtyczkigetClass() korzystanie z kolejki; Stworzyłem / uruchomiłem inny wątek monitorujący kolejkę referencyjną klasy.Tworzę tysiąc bitmap 1000x1000xARGB_8888, aby całkowicie zmusić gc.

Moje wątki monitorowania wydają się działać - widziałemloader2 uzyskać gc-ed, gdy użyłemloader1 aby załadować obie wtyczki przez pomyłkę ;-) - ale poza tym moje wątki pozostaną ciche, nawet w 4.3. Czy może brakuje mi czegoś oczywistego w tym przypadku testowym, czy też nadal tak jest

Dalvik VM obecnie nie wyładowuje klas

jako pracownik Googlefadden mówiAndroid: Kiedy klasy są rozładowywane przez system?

questionAnswers(1)

yourAnswerToTheQuestion