¿Sigue siendo el caso que Android nunca descarga clases?
Tenemos una aplicación grande que siempre se está ejecutando en el límite de conteo del método de miedo. Se me ha pedido que encuentre una manera de permitir que haga mucho más, incluidos los complementos de soporte. Buscando formas de descargar código, me encontré conConsejos JNI que dice
Las clases solo se descargan si todas las clases asociadas con un ClassLoader pueden ser recolectadas como basura, lo cual es raro pero no será imposible en Android.
Esto parecía implicar que un complemento se puede descargar si, por ejemplo,
usar un nuevoDexClassLoader
para cada archivo .jar,solo se refiere al complemento a través de una referencia de interfaz, yanule cualquier copia de esa referencia de interfaz cuando haya terminado.Entonces, creé un caso de prueba:
Creé un par de complementos triviales, usando un cargador único para cada uno.Creé unReferenceQueue<ClassLoader>
y creé referencias débiles a mis dos cargadores, usando esa cola; Creé / inicié un subproceso que se repite indefinidamente, haciendo una cola.remove()
y la presentación de informes.Yo también creé unaReferenceQueue<Class<?>>
y creó referencias débiles a cada plugingetClass()
usando la cola Creé / inicié otro hilo supervisando la cola de referencia de clase.Creo mil mapas de bits de 1000x1000xARGB_8888 para forzar completamente a gc.Mis hilos de monitoreo parecen funcionar - viloader2
Consiga gc-ed cuando lo useloader1
para cargar ambos complementos por error ;-) - pero por lo demás mis hilos permanecen en silencio, incluso en 4.3. ¿Tal vez me esté perdiendo algo obvio en este caso de prueba, o sigue siendo el caso que el
Dalvik VM actualmente no descarga clases
como empleado de GoogleFadden dice enAndroid: ¿Cuándo se descargan las clases por el sistema?