本文介绍了是不是仍然是Android的从未卸载类的情况?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有一个大的应用程序,始终运行进入恐惧的方法计数限制。我一直在问想出一个办法让它做更多的工作,包括支持插件。寻找各种方法来卸载code,我跑过 JNI提示它说

We have a large app that's always running into the dread method count limit. I've been asked to come up with a way to let it do much more, including supporting plugins. Looking for ways to unload code, I ran across JNI Tips which says

类是只卸载  可以被垃圾收集,这是罕见的,但不会是不可能的  Android系统。

这似乎在暗示,一个插件可以卸载,如果你说,

This did seem to imply that a plugin can be unloaded if you, say,

  1. 使用一个新的 DexClassLoader 每个.jar文件,
  2. 永远只能是指该插件通过接口引用和
  3. 在空出的该接口引用任何副本完成后。
  1. use a new DexClassLoader for each .jar file,
  2. only ever refer to the plugin through an interface reference, and
  3. null-out any copies of that interface reference when done.

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

So, I created a test case:

  1. 在我创建了几个微不足道的插件,采用了独特的加载器为每个。
  2. 在我创建了一个的ReferenceQueue<的ClassLoader> 和创建我的两个装载机弱引用,使用该队列;我创建/启动一个线程,循环下去,做一个队列卸下摆臂()和报告。
  3. 在我同样创建了一个的ReferenceQueue<类<>> 并创建每个插件的的getClass()使用队列;我创建/启动另一个线程监控类引用队列中。
  4. 在我创建了一个一千1000x1000xARGB_8888位图彻底强制GC。
  1. I created a couple of trivial plugins, using a unique loader for each.
  2. I created a ReferenceQueue<ClassLoader> and created weak references to my two loaders, using that queue; I created/started a thread that loops indefinitely, doing a queue .remove() and reporting.
  3. I similarly created a ReferenceQueue<Class<?>> and created weak references to each plugin's getClass() using the queue; I created/started another thread monitoring the class reference queue.
  4. I create a thousand 1000x1000xARGB_8888 bitmaps to thoroughly force gc.

我的监视线程似乎工作 - 我看到 loader2 获得GC-ED,当我用 loader1 来加载两个插件错误;-) - 但除此之外,我的线程保持沉默,甚至4.3。难道我也许缺少这个测试用例东西很明显,或者是它仍然是这样的

My monitoring threads seem to work - I saw loader2 get gc-ed when I used loader1 to load both plugins by mistake ;-) - but otherwise my threads stay silent, even on 4.3. Am I maybe missing something obvious in this test case, or is it still the case that the

Dalvik虚拟机目前不卸载类

为谷歌员工法登说,在Android:什么时候类会被从系统中卸载?

推荐答案

Dalvik虚拟机仍然无法卸载类。 JNI的提示页面是令人鼓舞的好行为,因此,如果虚拟机开始卸载类有一天你的应用程序不破。

The Dalvik VM still doesn't unload classes. The JNI Tips page is encouraging good behavior so your app doesn't break if the VM starts unloading classes someday.

这篇关于是不是仍然是Android的从未卸载类的情况?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-14 07:35