5

Estoy analizando el uso de la memoria de nuestra aplicación, y he encontrado Drawables extraño, que constantemente "come" algunos megabytes de montón. Aquí hay algunas capturas de pantalla de MAT:Cómo encontrar identificaciones o nombres de sistemas arrastrados preinstalados (mapas de bits) desde el volcado de memoria

Dominator tree árbol Dominator con 2 bastante grandes mapas de bits

path_to_gc_roots Camino a GC raíces de uno de los mapas de bits por encima de

Este mapas de bits aparece siempre en vuelcos de almacenamiento dinámico desde mi teléfono (Samsung Galaxy Nexus, OS 4.1.1), sin importar cuánto tiempo o qué tan intensivo uso nuestra aplicación.

Ya he intentado buscar el origen de estos mapas de bits usando MAT, sin suerte. Toda la información útil pude encontrar fue width y height de mapas de bits, que es tanto 512x512: bitmap_info

Pero nuestra aplicación no tiene ningún individuales 512x512 dibujables. Supongo que esto es un conjunto de "sistemas". Pero que exactamente? ¿Por qué ellos tan grandes?

También he observado el código fuente de la clase android.content.res.Resources, buscando el uso del campo sPreloadedDrawables, también sin suerte. Todo lo que obtengo del volcado de memoria es key del arreglo sPreloadedDrawables, pero no puedo determinar el nombre de archivo o la identificación de recursos de esta clave.

Por lo tanto, mi pregunta es:

  • ¿cómo se puede determinar que los nombres o identificadores de mapas de bits de este?

  • ¿Para qué se cargan estos enormes mapas de bits y por qué permanecen siempre en la memoria?

actualización:

he encontrado una manera de look at this bitmaps from memory dump. Estos dos mapas de bits son gradientes simples, uno negro, otro - blanco. Supongo que esto es recursos para Holo.Light y Holo.Dark temas de ICS. Pero mi segunda pregunta sigue siendo real: ¿por qué estos mapas de bits siempre se quedan en la memoria? ¿Hay alguna forma de subirlos o reciclarlos?

+0

¿Por qué quiere el nombre/identificación de estos mapas de bits? – toadzky

+0

Quiero nombre/identificación de estos mapas de bits para tratar de averiguar qué se cargan estos mapas de bits y quizás intentar hacer algo con ellos desde mi código – HitOdessit

Respuesta

0

Esta imagen de android.jar, que debe incluir en su proyecto. Hay dos cuadrados con el gradiente vertical. El primero - de 0x000000 a 0x272d33, el segundo - de 0xe8e8e8 a 0xfafafa. Puede encontrarlos en android.jar/res/drawable-nodpi/background_holo_dark.png y background_holo_light.png. Por supuesto, puede obtener resultados diferentes según su versión de Android SDK.

+0

esto no respondió mi pregunta - ** cómo ** para encontrar nombres de este bitmaps que solo tienen volcado de memoria? ¿Cómo encuentras este nombre? – HitOdessit

+0

si el recurso es público, el id entonces ES el nombre del archivo. debe ser android.R.drawable.background_holo_ [dark | light] – toadzky

0

Supongo que permanecen en la memoria porque son los fondos predeterminados para las actividades. Intente especificar un fondo diferente en su tema y vea si todavía están allí.

+0

Si este es un caso, ¿por qué hay dos temas en la memoria a la vez? (temas oscuros y claros) – HitOdessit

+0

ninguna idea realmente. – toadzky

0

Las cargas precargadas son cargadas por Zygote.

ZygoteInit#preloadResources()

/** 
* Load in commonly used resources, so they can be shared across 
* processes. 
* 
* These tend to be a few Kbytes, but are frequently in the 20-40K 
* range, and occasionally even larger. 
*/ 
private static void preloadResources() { 
    final VMRuntime runtime = VMRuntime.getRuntime(); 

    try { 
     mResources = Resources.getSystem(); 
     mResources.startPreloading(); 
     if (PRELOAD_RESOURCES) { 
      Log.i(TAG, "Preloading resources..."); 

      long startTime = SystemClock.uptimeMillis(); 
      TypedArray ar = mResources.obtainTypedArray(
        com.android.internal.R.array.preloaded_drawables); 
      int N = preloadDrawables(runtime, ar); 
      ar.recycle(); 
      Log.i(TAG, "...preloaded " + N + " resources in " 
        + (SystemClock.uptimeMillis()-startTime) + "ms."); 


      startTime = SystemClock.uptimeMillis(); 
      ar = mResources.obtainTypedArray(
        com.android.internal.R.array.preloaded_color_state_lists); 
      N = preloadColorStateLists(runtime, ar); 
      ar.recycle(); 
      Log.i(TAG, "...preloaded " + N + " resources in " 
        + (SystemClock.uptimeMillis()-startTime) + "ms."); 
     } 
     mResources.finishPreloading(); 
    } catch (RuntimeException e) { 
     Log.w(TAG, "Failure preloading resources", e); 
    } 
} 

Ves, los dibujables precargados son com.android.internal.R.array.preloaded_drawables

Cuestiones relacionadas