Tengo una aplicación para Android OpenGL que usa una cantidad considerable de memoria para configurar una escena compleja y esto claramente causa una fragmentación de montón significativa. Aunque no hay pérdidas de memoria, es imposible destruir y crear la aplicación sin que se quede sin memoria debido a la fragmentación. (La fragmentación es definitivamente el problema, no fugas)Android Heap Fragmentation Strategy?
Esto causa un problema importante ya que Android tiene la costumbre de destruir y crear actividades en la misma máquina virtual/montón que obviamente hace que la actividad se bloquee. Como una estrategia para contrarrestar esto he utilizado la siguiente técnica:
@Override
protected void onStop() {
super.onStop();
if(isFinishing()) {
System.runFinalizersOnExit(true);
System.exit(0);
}
}
Esto asegura que cuando la actividad está terminando causa una completa parada de máquina virtual y, por tanto, la próxima vez que se inicie la actividad se pone un montón sin fragmentar fresco.
Nota: Me doy cuenta de que esta no es la "forma de Android", pero dado que el recolector de basura no es compactante, es imposible reutilizar continuamente el montón.
Este techinque realmente funciona en general, sin embargo, no funciona cuando la actividad se destruye en un modo sin acabado y luego se vuelve a crear.
¿Alguien ha recibido alguna sugerencia sobre cómo manejar la degradación del montón?
Nota adicional: Reducir el consumo de memoria tampoco es una opción. La actividad en realidad no usa tanta memoria, pero el montón (y el montón nativo) parecen fragmentarse fácilmente, probablemente debido a algunos trozos grandes de memoria
tuve el mismo problema y empleé una solución similar. realmente terrible –