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

时间:2013-09-17 01:53:11

标签: android dexclassloader

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

  

只有在与ClassLoader关联的所有类时才会卸载类   垃圾收集,这是罕见的,但不是不可能的   机器人。

这似乎意味着,如果你说,

可以卸载一个插件
  1. 为每个.jar文件使用新的DexClassLoader
  2. 只能通过接口引用和
  3. 来引用插件 完成后,
  4. 将该接口引用的任何副本归零。
  5. 所以,我创建了一个测试用例:

    1. 我创建了几个简单的插件,每个插件使用一个独特的加载器。
    2. 我创建了一个ReferenceQueue<ClassLoader>并使用该队列创建了对我的两个加载器的弱引用;我创建/启动了一个无限循环的线程,执行队列.remove()并报告。
    3. 我同样创建了一个ReferenceQueue<Class<?>>并使用队列创建了对每个插件的getClass()的弱引用;我创建/启动了另一个监视类引用队列的线程。
    4. 我创建了一千个1000x1000xARGB_8888位图来彻底强制gc。
    5. 我的监控线程似乎有效 - 当我使用loader2错误地加载两个插件时,我看到loader1得到gc-ed ;-) - 但是否则我的线程保持沉默,即使在4.3。我可能在这个测试用例中遗漏了一些明显的东西,或者仍然是

      的情况
        

      Dalvik VM目前没有卸载类

      Google员工faddenAndroid: When do classes get unloaded by the system?

      中说

1 个答案:

答案 0 :(得分:1)

Dalvik VM仍然没有卸载类。 JNI提示页面鼓励良好的行为,因此如果VM有一天开始卸载类,您的应用程序不会中断。