Неужели Android никогда не выгружает классы?

У нас есть большое приложение, которое всегда работает в пределе счета метода ужаса. Меня попросили придумать способ сделать это намного больше, включая поддержку плагинов. Ищете способы разгрузить код, я наткнулся на Советы JNI, в котором говорится

Классы только выгружаются, если все классы, связанные с ClassLoader может быть собрано мусор, что редко, но не будет невозможным в Android.

Это означало, что плагин можно выгрузить, если вы, скажем,

  • используйте новый DexClassLoader для каждого .jar файла,
  • только ссылаться на плагин через ссылку на интерфейс, а
  • При завершении копирования любых копий этой ссылки интерфейса.

Итак, я создал тестовый пример:

  • Я создал несколько тривиальных плагинов, используя для каждого из них уникальный загрузчик.
  • Я создал ReferenceQueue<ClassLoader> и создал слабые ссылки на мои два загрузчика, используя эту очередь; Я создал/запустил поток, который бесконечно петлиет, делая очередь .remove() и сообщает.
  • Я также создал ReferenceQueue<Class<?>> и создал слабые ссылки на каждый плагин getClass(), используя очередь; Я создал/начал другой поток, контролирующий очередь ссылок класса.
  • Я создаю тысячу 1000x1000xARGB_8888 растровых изображений, чтобы полностью заставить gc.

Мои потоки мониторинга, похоже, работают - я видел loader2 get gc-ed, когда я использовал loader1 для загрузки обоих плагинов по ошибке;-) - но в остальном мои потоки остаются тихими даже в 4.3. Возможно, мне не хватает чего-то очевидного в этом случае, или это все еще так, что

Dalvik VM в настоящее время не выгружает классы

как сотрудник Google fadden говорит в Android: Когда классы разгружаются системой?

Ответ 1

Dalvik VM по-прежнему не выгружает классы. Страница советов JNI поощряет хорошее поведение, поэтому ваше приложение не прерывается, если VM начинает разгружать классы когда-нибудь.