我们有一个大型应用程序,总是遇到恐惧方法计数限制。我被要求想方设法让它做得更多,包括支持插件。正在寻找卸载代码的方法,我跑过JNI Tips说了
只有在与ClassLoader关联的所有类时才会卸载类 垃圾收集,这是罕见的,但不是不可能的 机器人。
这似乎意味着,如果你说,
可以卸载一个插件DexClassLoader
所以,我创建了一个测试用例:
ReferenceQueue<ClassLoader>
并使用该队列创建了对我的两个加载器的弱引用;我创建/启动了一个无限循环的线程,执行队列.remove()
并报告。ReferenceQueue<Class<?>>
并使用队列创建了对每个插件的getClass()
的弱引用;我创建/启动了另一个监视类引用队列的线程。我的监控线程似乎有效 - 当我使用loader2
错误地加载两个插件时,我看到loader1
得到gc-ed ;-) - 但是否则我的线程保持沉默,即使在4.3。我可能在这个测试用例中遗漏了一些明显的东西,或者仍然是
Dalvik VM目前没有卸载类
Google员工fadden在Android: When do classes get unloaded by the system?
中说答案 0 :(得分:1)
Dalvik VM仍然没有卸载类。 JNI提示页面鼓励良好的行为,因此如果VM有一天开始卸载类,您的应用程序不会中断。