2012-04-24 13 views
7

El desarrollo de una aplicación para Android desde hace semanas y me di cuenta de que me dieron mensajes como este en Catlog:Jit: Cambiar el tamaño de JitTable de 512 a 1024 y así sucesivamente .... ¿qué es esto?

Jit: Resizing JitTable from 512 to 1024 
(...) 
Jit: Resizing JitTable from 1024 to 2048 
(...) 
Jit: Resizing JitTable from 2048 to 4096 

Lo que se quiere decir? ¿Es una pérdida de memoria o algo así?

Y yo también tengo esto en la zona (...):

04-24 07:59:53.131: D/dalvikvm(874): GC_EXTERNAL_ALLOC freed 207K, 48% free 2980K/5639K, external 1448K/1458K, paused 66ms 
04-24 07:59:57.591: D/dalvikvm(874): GC_CONCURRENT freed 162K, 46% free 3122K/5767K, external 1371K/1673K, paused 11ms+17ms 
04-24 07:59:58.771: D/dalvikvm(874): GC_CONCURRENT freed 196K, 44% free 3445K/6087K, external 1145K/1657K, paused 10ms+6ms 
04-24 08:00:01.411: D/dalvikvm(874): GC_CONCURRENT freed 274K, 39% free 4267K/6983K, external 1145K/1657K, paused 6ms+7ms 
04-24 08:00:04.970: D/dalvikvm(874): GC_EXTERNAL_ALLOC freed 31K, 36% free 4479K/6983K, external 1145K/1657K, paused 89ms 

Aproximadamente en el 14% libre, tengo un accidente.

Esto ocurre cuando hago clic en los botones de menú (actividades cambiantes). pongo a prueba en el emulador, no sé los resultados en el teléfono ...

El error en el accidente en Logcat:

04-24 08:26:34.158: E/GraphicsJNI(482): VM won't let us allocate 1536000 bytes 
04-24 08:26:34.158: D/dalvikvm(482): GC_FOR_MALLOC freed 0K, 64% free 4280K/11655K, external 11662K/13614K, paused 72ms 
04-24 08:26:34.158: D/skia(482): --- decoder->decode returned false 
04-24 08:26:34.168: D/AndroidRuntime(482): Shutting down VM 
04-24 08:26:34.168: W/dalvikvm(482): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
04-24 08:26:34.218: E/AndroidRuntime(482): FATAL EXCEPTION: main 
04-24 08:34:37.807: E/AndroidRuntime(522): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
04-24 08:26:34.218: E/AndroidRuntime(482): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.KeySoft.OpenGuide/com.KeySoft.OpenGuide.Favourites}: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown> 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:284) 
04-24 08:34:37.807: E/AndroidRuntime(522): at com.KeySoft.OpenGuide.Top20.readBitmapImage(Top20.java:483) 
04-24 08:34:37.807: E/AndroidRuntime(522): at com.KeySoft.OpenGuide.Top20.addShopToList(Top20.java:251) 
04-24 08:34:37.807: E/AndroidRuntime(522): at com.KeySoft.OpenGuide.Top20.SqlShopsVissza(Top20.java:439) 
04-24 08:34:37.807: E/AndroidRuntime(522): at com.KeySoft.OpenGuide.Top20.onCreate(Top20.java:182) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.os.Looper.loop(Looper.java:130) 
04-24 08:34:37.807: E/AndroidRuntime(522): at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-24 08:34:37.807: E/AndroidRuntime(522): at java.lang.reflect.Method.invokeNative(Native Method) 
04-24 08:34:37.807: E/AndroidRuntime(522): at java.lang.reflect.Method.invoke(Method.java:507) 
04-24 08:34:37.807: E/AndroidRuntime(522): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-24 08:34:37.807: E/AndroidRuntime(522): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-24 08:34:37.807: E/AndroidRuntime(522): at dalvik.system.NativeStart.main(Native Method) 

utilizo 256 MB de RAM en emulador ... tal vez yo puedo evitar todo esto con dispositivos reales? dispositivos baratos también tiene al menos 384 MB de RAM (Galaxy Mini), pero oftem más ...

+1

Eso le indica que está utilizando la memoria. Si su aplicación falla, publique el mensaje de error que recibe. Esas son solo información sobre la recolección de basura y el compilador Just-In-Time. Sin embargo, es probable que use demasiada memoria o tenga una fuga. – zapl

+0

Editado mi pregunta –

+0

Supongo que está usando imágenes grandes. En algún lugar relacionado con un archivo xml de diseño en la línea 2. Como la memoria es limitada por aplicación (aproximadamente 16 MB), debe ser muy conservador cuando utiliza imágenes. Una imagen de 1 megapíxel (1000x1000) requiere una memoria RAM de 4 megabytes. – zapl

Respuesta

1

ya que has pedido en el comentario I use a 800x480 image. How can i make a good background with smaller size ?

A continuación se muestra un fragmento de código que le permitirá cambiar el tamaño de un mapa de bits.

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 

int width = bm.getWidth(); 

int height = bm.getHeight(); 

float scaleWidth = ((float) newWidth)/width; 

float scaleHeight = ((float) newHeight)/height; 

// create a matrix for the manipulation 

Matrix matrix = new Matrix(); 

// resize the bit map 

matrix.postScale(scaleWidth, scaleHeight); 

// recreate the new Bitmap 

Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); 

return resizedBitmap; 

} 
1

Pregunta 1: No hay un escape de memoria. JitTable es uso para almacenar la referencia jni. por ejemplo, cuando llamas a NewGlobalRef Api, la JitTable aumentará 1 registro.

este registro significa que JitTable no es suficiente, la máquina virtual cambiará el tamaño automáticamente. así que no te preocupes, solo mantén la referencia inútil de liberación correcta. está bien.

Pregunta 2:
GC_EXTERNAL_ALLOC, cuando asigna memoria nativa pero la memoria no es suficiente, se llama al GC. GC_CONCURRENT, cuando se asigna un tamaño de objeto superior a 384K https://developer.android.com/tools/debugging/debugging-memory.html#LogMessages

Cuestiones relacionadas