是不是Android永远不会卸载类?

Jon*_*itz 8 android dexclassloader

我们有一个大型的应用程序,总是遇到恐惧方法计数限制.我被要求想方设法让它做得更多,包括支持插件.寻找方法来卸载代码,我跑过JNI提示其说

只有在与ClassLoader关联的所有类都可以进行垃圾回收时,才会卸载类,这种情况很少见,但在Android中并非不可能.

这似乎意味着如果你说,你可以卸载一个插件

  1. DexClassLoader为每个.jar文件使用new ,
  2. 只能通过接口引用来引用插件,并且
  3. 完成后,取消该接口引用的任何副本.

所以,我创建了一个测试用例:

  1. 我创建了几个简单的插件,每个插件使用一个独特的加载器.
  2. ReferenceQueue<ClassLoader>使用该队列创建了一个并创建了对我的两个加载器的弱引用; 我创建/启动了一个无限循环,执行队列.remove()和报告的线程.
  3. 我类似地创建了一个ReferenceQueue<Class<?>>getClass()使用队列创建了对每个插件的弱引用; 我创建/启动了另一个监视类引用队列的线程.
  4. 我创建了一千个1000x1000xARGB_8888位图来彻底强制gc.

我的监控线程似乎工作 - loader2当我loader1以前错误地加载两个插件时,我看到得到gc-ed ;-) - 但是否则我的线程保持沉默,即使在4.3.我可能在这个测试用例中遗漏了一些明显的东西,或者仍然是这样的情况

Dalvik VM目前没有卸载类

正如Google员工faddenAndroid中所说的那样:什么时候系统会卸载类?

fad*_*den 1

Dalvik VM 仍然不卸载类。JNI Tips 页面鼓励良好的行为,这样如果虚拟机有一天开始卸载类,您的应用程序就不会崩溃。

  • 有谁知道 ART 是否卸载类? (3认同)
  • 也许不是——如果您指的是 64K 方法限制,则指的是可以从单个 DEX 文件引用的方法数量。这是编译时限制,而不是运行时限制。对可加载到内存中的方法数量的唯一实际限制是 LinearAlloc 大小,这给 Facebook 的 froyo 和姜饼带来了问题 (https://www.facebook.com/notes/facebook-engineering/under- the-hood-dalvik-patch-for-facebook-for-android/10151345597798920)。当然,如果有足够的类,您最终会填满堆。 (2认同)