Out-of-memory-Fehler auf Android
Ich bin die Entwicklung einer android-Spiel-Anwendung, wo ich über 15 Bildschirmen. Wenn ich kontinuierlich spielen, bekomme ich eine out of memory-error problem nach dem Zufallsprinzip, manchmal im 15-Bildschirm, und manchmal in der 12. Bildschirm oder so.
Schauen Sie sich auch das xml-unten, von einem der Bildschirme.
<?xml version="1.0" encoding="UTF-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/MainFrame"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<RelativeLayout
android:id="@+id/mainlayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/woodenbg1" >
<Chronometer
android:id="@+id/chronometer"
android:layout_width="0dp"
android:layout_height="0dp"
android:textSize="20sp"
android:textStyle="bold"
android:typeface="sans"
android:visibility="gone" />
<ImageView
android:id="@+id/imageline"
android:layout_width="10000dp"
android:layout_height="wrap_content"
android:layout_marginTop="105dp"
android:src="@drawable/lineblackfornormal" />
<ImageView
android:id="@+id/imageviewunderalphac"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="350dp"
android:src="@drawable/whitec" />
<ImageView
android:id="@+id/backgroundofalphab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="35dp"
android:src="@drawable/backgroundfordragimages"
android:visibility="invisible" />
<ImageView
android:id="@+id/backgroundofalphaa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="35dp"
android:src="@drawable/backgroundfordragimages"
android:visibility="invisible" />
<ImageView
android:id="@+id/backgroundofalphac"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginTop="33dp"
android:src="@drawable/backgroundfordragimages"
android:visibility="invisible" />
<ImageView
android:id="@+id/imageviewunderleftalphab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="250dp"
android:layout_marginLeft="15dp"
android:src="@drawable/whiteb" />
<ImageView
android:id="@+id/imageviewunderrightalphaa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="250dp"
android:layout_marginRight="10dp"
android:src="@drawable/whitea" />
<ImageView
android:id="@+id/imageviewabovealphab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="35dp"
android:src="@drawable/colouredb" />
<ImageView
android:id="@+id/imageviewabovealphaa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="35dp"
android:src="@drawable/coloureda" />
<ImageView
android:id="@+id/imageviewabovealphac"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/backgroundofalphac"
android:layout_marginTop="33dp"
android:src="@drawable/colouredc" />
</RelativeLayout>
</FrameLayout>
Logcat
05-16 12:22:18.989: E/GraphicsJNI(6745): VM won't let us allocate 2225664 bytes
05-16 12:22:18.999: E/AndroidRuntime(6745): FATAL EXCEPTION: main
05-16 12:22:18.999: E/AndroidRuntime(6745): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.graphics.Bitmap.nativeCreate(Native Method)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.content.res.Resources.loadDrawable(Resources.java:1709)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.content.res.Resources.getDrawable(Resources.java:581)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.view.View.setBackgroundResource(View.java:7533)
05-16 12:22:18.999: E/AndroidRuntime(6745): at com.ssn.myapp.NumbersLevel3.onCreate(NumbersLevel3.java:173)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2832)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.app.ActivityThread.access$1600(ActivityThread.java:117)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.os.Handler.dispatchMessage(Handler.java:99)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.os.Looper.loop(Looper.java:130)
05-16 12:22:18.999: E/AndroidRuntime(6745): at android.app.ActivityThread.main(ActivityThread.java:3683)
05-16 12:22:18.999: E/AndroidRuntime(6745): at java.lang.reflect.Method.invokeNative(Native Method)
05-16 12:22:18.999: E/AndroidRuntime(6745): at java.lang.reflect.Method.invoke(Method.java:507)
05-16 12:22:18.999: E/AndroidRuntime(6745): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-16 12:22:18.999: E/AndroidRuntime(6745): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-16 12:22:18.999: E/AndroidRuntime(6745): at dalvik.system.NativeStart.main(Native Method)
haben Sie alle versucht BitmapFactory.Optionen ?
finden Sie diese osdir.com/ml/AndroidDevelopers/2009-08/msg01230.html
würde es helfen, wenn Sie uns zeigen, einige Ihrer Aktivität-code.
finden Sie diese osdir.com/ml/AndroidDevelopers/2009-08/msg01230.html
würde es helfen, wenn Sie uns zeigen, einige Ihrer Aktivität-code.
InformationsquelleAutor DevAndro | 2013-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Recycle bitmaps, wenn nicht in Gebrauch. Nach honeycomb bitmaps bleiben Sie auf heap.
http://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html.
Den link oben hat ein Thema auf, wie um Speicherverluste zu vermeiden.
Auch wenn Sie haben Bild in hoher Auflösung , sollten Sie die Skala unten. Finden Sie unter Laden eine abgespeckte Version in den Speicher.
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
Nehme an, Sie navigieren form actiivty A nach B. In onResume() laden von bitmaps. In onPause() recycle-bitmaps. Tun Sie dies für jede Tätigkeit, wo Sie laden von bitmaps.
Können Sie mit MAT-Analyzer wie gezeigt im video unten, um zu analysieren und zu beheben memeory leaks
http://www.youtube.com/watch?v=_CruQY55HOk
Könnte man die Verwendung von android:largeHeap in manifest unter Anwendung tag.
Achtung : Da die heap-Größe erhöht die GC Tritte häufiger und häufiger app Pausen. Also nur weil Sie erfordern einen größeren heap Sie sollten nicht diese. Sehen Sie das video oben und der Kerl warnt etwa die gleiche.
Ob Ihre Anwendung Prozesse geschaffen werden sollte, mit einem großen Dalvik-heap. Dies gilt für alle Prozesse, die für die Anwendung erstellt. Es gilt nur für die erste Anwendung geladen in einen Prozess; wenn Sie eine gemeinsame Benutzer-ID zu ermöglichen, mehrere Anwendungen zu verwenden, ein Prozess, Sie alle müssen verwenden Sie diese option, kontinuierlich oder Sie wird zu unvorhersehbaren Ergebnissen führen.
Sollten die meisten apps benötigen Sie dies nicht und muss stattdessen den Fokus auf die Reduzierung Ihrer gesamten Speicher für eine verbesserte Leistung. Die Aktivierung dieser übernimmt auch keine Garantie für eine Feste Erhöhung des verfügbaren Speichers, da einige Geräte sind beschränkt durch Ihre verfügbaren Gesamtspeicher.
Abfrage der verfügbaren Speicher-Größe zur Laufzeit, verwenden Sie die Methoden getMemoryClass() oder getLargeMemoryClass().
InformationsquelleAutor Raghunandan
Es ist, weil Ihre Bilder nicht immer freigegeben ist, wenn Sie Ihre Aktivität zerstört wird.
Finden diese Antwort. Auch diese link zu.
Ich glaube nicht, dass man machen sollte, um die granularen details bei der GC ausgeführt wird, wie wir haben keine Kontrolle über die bei der gc aufgerufen wird. Auch Aufruf von gc() wird keine Garantie für eine Sammlung. Pro Dokumentation von System.gc()
Memmory is exceeded. GC automatically collects all unused bitmaps. So voluntarily we have to remove it
In die Entwicklung der Anwendung mit large object allocation ich Angst, das folgende statt:
Ich hoffe Das kann dir helfen.
When i continuously play, i get an out of memory error problem randomly
OP nur saids wie diese. Das ist, warum ich denke, dassimages aren't getting deallocated
.kann u erklären, dieser Teil deutlich mehr "Bilder sind nicht immer freigegeben". Aus dem logcat seine OOM.
sehen Sie die updates und sagen, dass es richtig ist oder nicht.
laut logcat seine OOM, da die bitmap size exceeds VM budget bedeutet das es ist nicht genügend Speicherplatz zugewiesen werden für bitmaps. Sollten Sie recyceln bitmaps, wenn nicht in Gebrauch. Bei der gc startet, wird der freie Speicher. Zweitens sollte er das laden von bitmaps (Bilder) effizient. Er sollte nach unten skalieren Sie das Bild, wenn es zu groß ist. Er sollte den laden von bitmaps in onResume() und entsorgen es in der onPause(). Dies stellt sicher, dass bei der gc aktiv wird, und die Aktivität angehalten wird Speicher freigegeben wird.
InformationsquelleAutor Gunaseelan