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).

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)); } }); } 

}

Introduzca aquí la descripción de la imagen

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:

Introduzca aquí la descripción de la imagen

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. Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen

  • 17.8 MiB asignación de montón para un simple "Hello World" proyecto?
  • Notificación de Android - java.lang.Throwable: volcado de pila
  • Razones por las que mi aplicación Android se bloquea en mi teléfono de forma consistente, pero no en mi emulador
  • Cómo controlar la pila trasera de Android
  • Diferenciar entre un inicio de actividad de la pantalla de inicio o de otra actividad de la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.