Android que entiende los tamaños de pila

Soy bastante nuevo en el desarrollo de Android y parece que no puedo captar la excepción Java Out of Memory. Sé que significa que mi aplicación ha superado el presupuesto de la máquina virtual, pero después de Google muchas veces, parece que todavía no entiendo este concepto. Me temo que mi aplicación utiliza demasiada memoria porque tengo seis selectores de botones por pantalla con dos mapas de bits para cada selector, que están alrededor de 20 kb cada uno de acuerdo con la pestaña de propiedades. En mi G2x arraigado, he establecido el presupuesto de la máquina virtual en 12 mb, reinicié mi teléfono y ejecuté mi aplicación sin ningún problema. Estoy desenlazando los elementos dibujables de cada uno en Destruir () e insinuando al GC que se ejecute aquí también. Después de usar la aplicación durante un tiempo en el emulador, hago clic en "Causa GC" en mi pantalla DDMS y los resultados son ID = 1, Tamaño del montón 6.133 MB, 2.895 MB asignados, 3.238 MB gratis,% Usado 47.20, # Objetos 52.623.

Aquí es donde no entiendo lo que está pasando, mi emulador está configurado a 24 MB de VM. ¿Dónde está ese número? El problema real que tengo es que si configuro el emulador en 16 MB de VM, mi aplicación se bloquea en la segunda actividad con la excepción Fuera de memoria. ¿Por qué no se bloquea en mi teléfono con la VM configurada en 12 MB o en mi antiguo teléfono HTC Magic con 12 MB de stock de VM? También, ¿piensan que mi aplicación está tomando demasiada memoria? No tengo idea si esos números DDMS son buenos o no. Gracias por tu tiempo.

En cuanto a mi código, tengo todas las imágenes especificadas en diseños XML, no hago nada programático con ellas, excepto para agregarles escuchas. Encontré este fragmento de código aquí y lo he agregado a cada actividad que tengo ...

@Override
protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.myRootLayout));
    System.gc();
}

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        ((ViewGroup) view).removeAllViews();
    }
}

De lo contrario, todo lo que hago es agregar onClickListeners a los botones que tienen fondos PNG. Me gustaría aprender a especificar los fondos de los botones programáticamente, pero necesito tener las funciones del selector como enfocar, presionar, no enfocado pero presionado, etc. para hacer que los fondos de los botones cambien de acuerdo con la interacción del usuario. He revisado los documentos acerca de esto, pero parece abrumador, por eso me di cuenta de que comenzaría aquí con los conceptos básicos de administración de Heaps y trabajaría para especificar selectores en el código. Esto puede no tener sentido, pero ¿hay una cantidad "saludable" de asignación de memoria que una aplicación pueda asignar sin acercarse a la excepción de memoria insuficiente? Por ejemplo, si una aplicación asignó 6 MB, debería estar bien, pero 8 MB la estarían presionando, ¿existen límites similares en la asignación de memoria? Gracias nuevamente Alex Lockwood por su respuesta. Voy a leerlo y releerlo hasta que esto tenga sentido para mí.

Respuestas a la pregunta(2)

Su respuesta a la pregunta