Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


OutOfMemoryException en el emulador

Realmente no sé cómo hacer frente a esta situación. De repente estoy recibiendo una OutOfMemoryException en una actividad específica y es la misma cada vez que sigue el mismo camino en el juego que estoy desarrollando. Yo uso un montón de Drawables en mi juego. Leí en alguna parte que usted debe realizar Bitmap.recycle () a menudo para conseguir la memoria liberada. Pero casi nunca uso Bitmaps directamente y los Drawabels que utilizo, necesito que estén en la pantalla.

Probablemente no ayuda que estoy usando el Facebook y Parse SDK.

  • Ocultar barra de sistema en tabletas
  • Android Drag / Animación de vistas
  • Cómo puedo guardar los colores en array.xml y obtener su espalda a Color matriz
  • Comprobar y evitar fugas de memoria en la aplicación
  • ¿Cuál es el propósito de usar Intent.createChooser () en StartActivity () al enviar correo electrónico en Android
  • Problemas de almacenamiento intermedio con android.media.MediaPlayer
  • Ahora mismo estoy desarrollando en mi teléfono y en el emulador. En el emulador el tamaño del montón no puede ser más de 30 MB. ¿Debo aumentar este número o debo dejarlo solo y tratar de mantener el consumo de memoria de mi aplicación?

    Lo que asumí, hasta hace poco, era que una vez que termine una Actividad e ingrese a la otra, que todo será recolectado de basura y empiezo de nuevo Código de ejemplo:

    private void startGamesActivity() { Intent intent = new Intent(this, SS3GamesActivity.class); startActivity(intent); finish(); } 

    ¿No es cierto? Permítanme elaborar un poco más. Tengo una Actividad con dos ListViews de posibles reproductores de Facebook. La OutOfMemoryException ocurre cuando hago clic en uno de ellos para iniciar una nueva actividad que debería consumir menos memoria que la anterior. ¡Ése es porqué no entiendo porqué el OutOfMemoryException incluso sucede! Debe haber un montón de memoria a la izquierda después de los dos ListViews obtener recogida de basura!

    Así que lo que ahora hacía era analizar mi consumo de Heap. También descargé el Eclipse Memory Analyzer. El bloque de memoria más grande que se está utilizando es matriz de 1 byte (byte [], boolean []) que tiene un recuento de 702, un tamaño total de 20.096 MB donde el más grande ist 6,240 MB y 29,314 MB promedio. Esto me parece que beeing mucho! Ni siquiera aumentar mucho en toda la aplicación. Pero al ver que en el emulador el tamaño de Heap no aumenta más de 30MB, se produce un gran potencial.

    Uso de Eclipse Memory Analyzer también me da dos posibles culpables de fuga de memoria.

    Problema Suspect 1 Una instancia de "android.graphics.Bitmap" cargado por "" ocupa 6.543.416 (28,00%) bytes. La memoria se acumula en una instancia de "byte []" cargado por "".

    Problem Suspect 2 La clase "android.content.res.Resources", cargada por "", ocupa 5.212.968 (22,31%) bytes. La memoria se acumula en una instancia de "java.lang.Object []" cargado por "".

    El resultado no es tan sencillo como pensaba. Creo que un posible sospechoso a juzgar por los nombres de las clases es mi LruCache. Utilizo esto para poblar con las miniaturas de Facebook de las fotos posibles del jugador como para no cargarlas de la web cada vez que el usuario se desplaza en el ListView. No estoy seguro de por qué ya es tan grande al principio de mi aplicación. Ya traté de hacerlo más pequeño pero no tuve suerte.

    Esto está en onCreate de mi MainActivity:

     // caching system final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 16; // used to be 8, didnt help though mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { // The cache size will be measured in kilobytes rather than // number of items. return bitmap.getByteCount() / 1024; } }; 

    También he comprobado el segundo posible sospechoso, los recursos y no hay realmente mucho que podía hacer. Parece que hay todos mis objetos de diseño que estoy usando y no puedo usar menos de lo que estoy haciendo ahora mismo.

    También mientras estamos en ello, algo como "onDestroy" ayuda?

     public class ExampleActivity extends Activity { HashMap<String, String> meMap=new HashMap<String, String>(); static ArrayList<String> meArray = new ArrayList<String>(); protected void onDestroy() { super.onDestroy(); meMap.clear(); meMap = null; meArray.clear(); meArray = null; } } 

    Porque no vi mucha diferencia consumo de memoria thats por qué asumo que el gc hace eso aotomatically.

    Con gusto tomaría todas las sugerencias posibles a mi problema. Incluso puedo proporcionar más información, pero en este momento no sé qué.

    StackTrace en verde:

     05-06 07:37:12.373: I/dalvikvm(529): Wrote stack traces to '/data/anr/traces.txt' 05-06 07:37:12.523: E/dalvikvm-heap(529): Out of memory on a 3601936-byte allocation. 05-06 07:37:12.523: I/dalvikvm(529): "main" prio=5 tid=1 RUNNABLE 05-06 07:37:12.533: I/dalvikvm(529): | group="main" sCount=0 dsCount=0 obj=0x409c1460 self=0x12810 05-06 07:37:12.533: I/dalvikvm(529): | sysTid=529 nice=0 sched=0/0 cgrp=default handle=1074082952 05-06 07:37:12.533: I/dalvikvm(529): | schedstat=( 8842421920 6327029011 3892 ) utm=778 stm=106 core=0 05-06 07:37:12.533: I/dalvikvm(529): at android.graphics.Bitmap.nativeCreate(Native Method) 05-06 07:37:12.533: I/dalvikvm(529): at android.graphics.Bitmap.createBitmap(Bitmap.java:605) 05-06 07:37:12.533: I/dalvikvm(529): at android.graphics.Bitmap.createBitmap(Bitmap.java:551) 05-06 07:37:12.533: I/dalvikvm(529): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437) 05-06 07:37:12.533: I/dalvikvm(529): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524) 05-06 07:37:12.533: I/dalvikvm(529): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499) 05-06 07:37:12.533: I/dalvikvm(529): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351) 05-06 07:37:12.533: I/dalvikvm(529): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773) 05-06 07:37:12.533: I/dalvikvm(529): at android.content.res.Resources.loadDrawable(Resources.java:1935) 05-06 07:37:12.533: I/dalvikvm(529): at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 05-06 07:37:12.533: I/dalvikvm(529): at android.widget.ImageView.<init>(ImageView.java:119) 05-06 07:37:12.533: I/dalvikvm(529): at android.widget.ImageView.<init>(ImageView.java:109) 05-06 07:37:12.533: I/dalvikvm(529): at java.lang.reflect.Constructor.constructNative(Native Method) 05-06 07:37:12.533: I/dalvikvm(529): at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 05-06 07:37:12.533: I/dalvikvm(529): at android.view.LayoutInflater.createView(LayoutInflater.java:586) 05-06 07:37:12.533: I/dalvikvm(529): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 05-06 07:37:12.533: I/dalvikvm(529): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653) 05-06 07:37:12.543: I/dalvikvm(529): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678) 05-06 07:37:12.543: I/dalvikvm(529): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 05-06 07:37:12.543: I/dalvikvm(529): at android.view.LayoutInflater.rInflate(LayoutInflater.java:742) 05-06 07:37:12.543: I/dalvikvm(529): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 05-06 07:37:12.543: I/dalvikvm(529): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 05-06 07:37:12.543: I/dalvikvm(529): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 05-06 07:37:12.543: I/dalvikvm(529): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 05-06 07:37:12.543: I/dalvikvm(529): at android.app.Activity.setContentView(Activity.java:1835) 05-06 07:37:12.543: I/dalvikvm(529): at com.quizdom.SS7ChooseTopicsActivity.onCreate(SS7ChooseTopicsActivity.java:36) 05-06 07:37:12.543: I/dalvikvm(529): at android.app.Activity.performCreate(Activity.java:4465) 05-06 07:37:12.543: I/dalvikvm(529): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 05-06 07:37:12.543: I/dalvikvm(529): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 05-06 07:37:12.543: I/dalvikvm(529): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 05-06 07:37:12.543: I/dalvikvm(529): at android.app.ActivityThread.access$600(ActivityThread.java:123) 05-06 07:37:12.543: I/dalvikvm(529): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 05-06 07:37:12.543: I/dalvikvm(529): at android.os.Handler.dispatchMessage(Handler.java:99) 05-06 07:37:12.543: I/dalvikvm(529): at android.os.Looper.loop(Looper.java:137) 05-06 07:37:12.543: I/dalvikvm(529): at android.app.ActivityThread.main(ActivityThread.java:4424) 05-06 07:37:12.543: I/dalvikvm(529): at java.lang.reflect.Method.invokeNative(Native Method) 05-06 07:37:12.543: I/dalvikvm(529): at java.lang.reflect.Method.invoke(Method.java:511) 05-06 07:37:12.543: I/dalvikvm(529): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 05-06 07:37:12.543: I/dalvikvm(529): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 05-06 07:37:12.543: I/dalvikvm(529): at dalvik.system.NativeStart.main(Native Method) 

  • Ideal para Android Studio gitignore archivo
  • Antiguas versiones de Android NDK
  • Cómo centrar un ImageView verticalmente en su matriz?
  • Cargador de archivos Android OpenGL .OBJ
  • Problema con aapt.exe
  • ¿Cómo agregar icono en la vista de EditarTexto en Android?
  • 3 Solutions collect form web for “OutOfMemoryException en el emulador”

    Obviamente no he visto los mapas de bits que estás cargando, pero supongo que serían mucho más grandes de lo que necesitan para el espacio en el que los estás mostrando. Si descarga, por ejemplo, una imagen de 3000 x 2000 y, a continuación, asignarla como fuente de un ImageView de sólo 300 x 200, el tamaño de mapa de bits original todavía se almacena en la memoria y sólo se muestra más pequeño. Es importante que al descargar una imagen desde la Web, cambie el tamaño del mapa de bits recibido al tamaño de la pantalla antes de configurarlo como fuente de ImageView. No hacerlo consumirá grandes trozos de memoria.

    Esto es bastante un montón de código como usted necesita para protegerse contra muchas condiciones de error diferentes durante este proceso. La solución más fácil que puedo ofrecerte es probar la biblioteca de Picasso . Puede pasar la URL que desea descargar con un código similar al que se muestra a continuación y se descargará en un hilo de fondo, cambiar el tamaño y ponerlo en el ImageView cuando esté listo. También almacenará en caché la versión redimensionada de modo que, si necesita descargar la misma imagen, utiliza la versión en caché si es adecuada para ImageView para la que se está cargando. Esto significa que no se pierde el tráfico de red también. Si necesita realizar algunas transformaciones en la imagen antes de colocarla en ImageView, puede hacerlo también proporcionando un objeto Transform . También puede establecer una imagen de marcador de posición, que debería tener en sus carpetas drawable y mostrará que hasta que se haya descargado la imagen real.

     Picasso.with(context) .load("http://i.imgur.com/DvpvklR.png") .into(imageView); 

    Pasos básicos

    De acuerdo con esta respuesta , hay algunos pasos básicos que debe seguir en este caso:

    • En Android 3.0+, utilice inBitmap en las BitmapOptions que pasa a BitmapFactory, para reutilizar la memoria existente en lugar de asignar nueva memoria
    • recycle() tus objetos Bitmap cuando termines con ellos
    • Sea generalmente cuidadoso con sus asignaciones de memoria, ya que el recolector de basura de Android no se compacta, por lo que finalmente será incapaz de asignar grandes bloques de memoria de nuevo
    • Use MAT para ver si está goteando memoria en alguna parte que está contribuyendo a su problema.

    Algunos posts que podrían ser útiles

    Vea este post sobre la gestión de la memoria de mapa de bits , y también sobre cómo cargar mapas de bits grandes . Estos pueden ayudarle.

    También debe manejar su reciclaje de vista en su ListView . Vea este post sobre Manejo de Reciclaje ListView .

    Espero que esto te ayude.

    Creo que el problema es que usted está filtrando la Activity actual. Estás pasando this como el primer parámetro, que en este caso es un Context . Por lo tanto, está utilizando la actividad actual como contexto y lo siguiente que debe hacer es terminarlo. La actividad se cierra, pero su memoria se filtra porque usted pasó una referencia a la intención.

    Prueba esto:

     Intent intent = new Intent(getApplicationContext(), SS3GamesActivity.class); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.