Это все еще тот случай, когда Android никогда не выгружает классы?
У нас есть большое приложение, котороеs всегда сталкиваются с пределом количества методов страха. Я'Меня попросили придумать способ, позволяющий ему делать гораздо больше, включая поддержку плагинов. Ища способы выгрузки кода я наткнулсяСоветы JNI который говорит
Классы выгружаются только в том случае, если все классы, связанные с ClassLoader, могут быть собраны сборщиком мусора, что встречается редко, но не является невозможным в Android.
Казалось, это подразумевает, что плагин может быть выгружен, если вы, скажем,
использовать новыйDexClassLoader
для каждого файла .jar,только когда-либо ссылаться на плагин через ссылку на интерфейс, иобнулите любые копии этой ссылки интерфейса, когда закончите.Итак, я создал тестовый пример:
Я создал пару тривиальных плагинов, используя уникальный загрузчик для каждого.Я создалReferenceQueue
и создал слабые ссылки на мои два загрузчика, используя эту очередь; Я создал / запустил поток, который зацикливается бесконечно, делая очередь.remove()
и отчетность.Я так же создалReferenceQueue
и создал слабые ссылки на каждый плагинgetClass()
используя очередь; Я создал / запустил другой поток, отслеживающий очередь ссылок на классы.Я создаю тысячу 1000x1000xARGB_8888 растровых изображений, чтобы тщательно форсировать gc.Кажется, мои потоки мониторинга работают - я виделloader2
получить gc-ed, когда я использовалloader1
загрузить оба плагина по ошибке ;-) - но в остальном мои темы молчат, даже на 4.3. Может быть, я упускаю что-то очевидное в этом тестовом примере, или это все еще тот случай, когда
Далвик В.М.т в настоящее время выгрузить классы
как сотрудник GoogleФадден говорит вAndroid: когда классы выгружаются системой?