Prueba de memoria de Android
Esto puede ser una pregunta estúpida, pero no puedo encontrar un montón de información específica en Internet.
Digamos que tengo 2 actividades: MainActivity y Secondactivity. La actividad principal tiene un botón para ir a la segunda actividad. La segunda actividad tiene un botón que se remonta a la actividad principal (código muy simple abajo).
- Configuración de Android AppWidget - Comienza en una nueva tarea
- Android: Bitmaps, SoftReferences y OOMs?
- Android, veo que el montón crece, pero quiero que pare
- Ciclo de vida de la clase de aplicaciones Android
- Cómo agrupar las notificaciones de Android como whatsapp?
Estoy tratando de entender la gestión de memoria android y es por eso que estoy haciendo esta prueba.
Mi pregunta:
Cuando constantemente ir y venir entre las actividades, mientras que mira el gráfico de la memoria en el estudio de Android, puedo ver un gráfico azul que nunca vuelve a la memoria asignada que tenía en el inicio de la aplicación. ¿Tengo fugas de memoria? (Probablemente no causa esto es código básico). Pero entonces ¿por qué nunca volver a su memoria asignada original al principio?
La actividad principal sólo tiene este método:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnTest = (Button) findViewById(R.id.btnTest); btnTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(null, "test"); finish(); startActivity(new Intent(MainActivity.this, SecondActivity.class)); } }); }
Mientras que la SecondAcitivity sólo se remonta a la primera y crea unos botones
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Button btnTest = (Button) findViewById(R.id.btnTest); btnTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(null, "test"); finish(); startActivity(new Intent(SecondActivity.this, MainActivity.class)); } }); }
}
- ¿Cómo depurar Android ANR?
- Cómo borrar la pila de Android de las actividades?
- Restaurar la pila posterior de Android después de cerrar la aplicación
- La aplicación de Android se reinicia al cerrar / cerrar fuerza
- Cómo hacer que la aplicación de Android que "come" la memoria RAM
- Android: ¿Cuánta memoria utiliza mi aplicación?
- Alto uso de memoria RAM para la aplicación vacía de Android
- Obtenga el tamaño de RAM total que utiliza Aplicación en Android
Creo que el problema fue usar genymotion como un emulador. Usted debe utilizar un dispositivo real para el análisis de memoria, también el monitor de memoria más antiguo es más preciso.
No hay una pérdida de memoria en el código. La razón del aumento en la memoria asignada es porque su aplicación utilizará algunos para transferir a diferentes actividades. Pero, si continúa ejecutando este código para siempre, verá gotas repentinas, he dibujado esto:
Cada vez que se produce la recolección de basura, la memoria asignada se apagará. Sin embargo, si tiene una pérdida de memoria, significa que GC no podrá deshacerse de ciertos objetos. Para ello, verá una línea de tendencia con un aumento general, hasta que se produce un error de memoria.
¿Cómo puedes probar esto?
Le sugiero que lo haga para que las intenciones se llamen en el onCreate
para un bucle infinito de actividades de ida y vuelta. A menos que obtenga un error OutOfMemory
, es probable que no tenga una pérdida de memoria.
En la guía para desarrolladores:
A medida que asigne más objetos en su aplicación, forzará una recolección de basura periódica, creando poco "hipo" en la experiencia del usuario. El recolector de basura concurrente introducido en Android 2.3 ayuda, pero el trabajo innecesario siempre debe evitarse.
El gráfico azul es la cantidad de memoria asignada.
Por qué aumenta la memoria asignada
Cuando usted va y viene entre las dos actividades, su aplicación se está asignando memoria para crear nuevas actividades.
¿Por qué no disminuye la memoria asignada?
No disminuye porque los recuerdos se liberan durante la recolección de basura. Dalvikvm determinará cuándo debe ocurrir una recolección de basura por lo tanto es posible que la recolección de basura no ocurra durante un período de tiempo prolongado. Puede continuar yendo y viniendo entre las dos actividades para aumentar la memoria asignada y una vez que la memoria asignada es lo suficientemente grande debería ver una caída repentina en la cantidad de memoria asignada.
¿Por qué hay una caída repentina en la memoria asignada
La memoria asignada se libera cuando se produce una recolección de elementos no utilizados. Si echa un vistazo a logcat en el estudio de Android, la caída repentina en la memoria asignada debe ir acompañada de un mensaje Dalvikvm GC_something liberado. Esto significa que se ha producido una recolección de basura y se liberan los recuerdos. Puede observar esto sucediendo haciendo clic en el botón Iniciar GC (izquierda del gráfico azul) para activar manualmente la recolección de basura.
Es sólo una cuestión de recolección de basura (GC). Incluso si escribe un código mínimo, el marco puede realizar un montón de trabajo detrás de las escenas. De hecho, está creando explícitamente unos pocos objetos en cada clic.
Aquí está el gráfico de la memoria donde se puede ver el efecto de GC.
- Android: Dejar de recrear la actividad en el cambio de orientación
- Error de getApplicationContext () Android