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