2009-07-01 14 views
2

Ich bekomme OutOfMemoryException in einer J2ME-Anwendung.OutOfMemoryError in j2me-Anwendung

Wie kann ich herausfinden, was diesen Fehler verursacht? Und wie kann man diesen Fehler vermeiden?

Ich mache eine HTTP-Anfrage. Während die Anfrage nicht abgeschlossen ist, zeigt der Bildschirm ein Ladebild (wie ein Browser zeigt, wenn eine Seite geladen wird). Dies wurde getan, indem ein Bild erstellt und der Bildschirm neu gezeichnet wurde. > Neuzeichnen - -

image 1 erstellen> Neuzeichnen - -> Bild erstellen 2-> repaint-> Bild 3 erstellen> erstellen Bild 1-> neu gezeichnet ->.

Ich bemerkte (mit wtk Speichermonitor), dass dies zu viel Speicher verbrauchte, die nicht Müll gesammelt wurde.

Dann habe ich versucht, eine Klasse zu erstellen, die Art von Pool von Bildern ist. Diese Klasse erstellt alle Bilder und zeigt sie dann an.

erstellen Bild 1 -> erstellen Bild 2-> erstellen Bild 3 -> Neuzeichnen -> Neuzeichnen -> Neuzeichnen -> Neuzeichnen -> Neuzeichnen ->.

Dieses zweite Szenario scheint nicht so viel Speicherplatz zu verbrauchen wie der erste. (mit wtk Speichermonitor).

Aber ich denke, (nicht sicher, ob dies ist) jene beiden Ansätze tragen diese OutOfMemoryException zu verursachen.

+0

Führen Sie es in einem Debugger aus? –

+0

Ich renne in das Gerät. Wenn ich einen Emulator benutze, erhalte ich diesen Fehler nicht. –

+0

Welche IDE verwenden Sie, wenn welche? Es kann einen Profiler haben, den Sie verwenden können, um zu finden, was so viel Speicher verbraucht. – kwatford

Antwort

2

Die Ursache des Fehlers ist ein Mangel an Speicher. Leider, das Offensichtliche zu erklären, aber man fragt :-)

würden Einige Quellcode, um das genaue Problem zu diagnostizieren erforderlich.

Sie sollten auch nach Teilen Ihres Codes suchen, die entweder rekursive Methodenaufrufe ausführen oder Speicher innerhalb einer Schleife zuweisen. Rekursive Aufrufe würden normalerweise eine StackOverflowException generieren, aber es lohnt sich. Das Zuweisen von Speicher innerhalb einer Schleife kann jedoch schnell zu einem OutOfMemoryError führen.

+0

Ich weiß, ist der Mangel an Speicher. Aber die Anwendung ist einfach genug und sollte dieses Problem nicht haben. –

+0

Deshalb habe ich nach dem Quellcode gefragt.Ich sagte, es sei ein "Mangel an Erinnerung". –

+0

Weitere Informationen in der Frage hinzugefügt. –

0

Je nach den Einschränkungen des Geräts kann das Erstellen und Verwalten von 3 Vollbildbildern ein Problem darstellen.

Sind Ihre drei "Lade" -Bilder drastisch anders? Oder sind sie im Großen und Ganzen das gleiche Bild, wobei nur ein kleiner Teil von Bild zu Bild verschieden ist (zum Beispiel sind alle verschiedene Bilder eines "Spinnrads" in der Mitte eines großen weißen Feldes)?

Wenn Sie mit Bild 1 das volle Bild, das Sie anzeigen, und Bild 2 und 3 mit kleinen Bildern, die über Bild 1 gezeichnet werden können, können Sie eine Menge Speicher auf diese Weise speichern.

Das ist: Erstellen Sie Bilder 1-3 am Anfang. Zeichnen Sie dann bei repaint() immer Bild 1 und optional Bild 2 oder Bild 3, abhängig vom Schritt in der Animation.

+0

Alle Bilder sind klein (16x16, ~ 460bytes) und ich übergebe die Position zum Repaint: Repaint (100, 73, 16, 16). Und ich verwende 8 Bilder, nicht 3. –

+1

Wie groß ist der Inhalt in Ihrer http-Anfrage zurückgegeben? Könnte das Ihre Speicherfehler verursachen? Wenn Sie sicher sind, dass das Speicherproblem das Erstellen/Behalten/Malen von Bildern ist, können Sie versuchen, die Sprite-Klasse zu verwenden. Es klingt ähnlich wie die Klasse, die Sie für Szenario 2 erstellt haben, und ist wahrscheinlich für die engen Einschränkungen von Mobilgeräten optimiert. –

+0

Die HTTP-Antwort ist klein. Ich bin mir sicher, dass das Bild nicht das * einzige * Problem ist. Hasse es, den Code von jemand anderem zu behalten! Ich werde diese Sprite-Klasse überprüfen. –

0

die Bilder nur einmal erstellen und wiederverwenden, wo immer Sie wollen und die ihre Referenz machen so schnell auf null, wie die Anforderung vorbei ist. Dies wird dazu führen, dass sie Müll gesammelt werden.

Erstellen Sie keine unerwünschten Variablen oder Objekte (insbesondere Bildobjekte).

Sie können die Garbage Collection explizit System.gc() durch den Aufruf initiieren.Aber häufiges Aufrufen kann die Leistung beeinträchtigen

1

Ihre OutOfMemoryException während Bildanzeige auf dem Handy ist aufgrund des Mangels an Speicher in Heap kann dies durch durchgeführt werden. Müllsammler wie System.gc(); läuft aber leider nicht in J2ME.

So können wir hier

Runtime.getRuntime().gc(); 

statt

System.gc(); 
1

Dieses Problem normalerweise auftreten verwenden, wenn es zu wenig Arbeitsspeicher in Emulator ist.

Gründe:

  1. Sie zu viel Bilder verwenden.
  2. initialisieren Sie zu viele Objekte.
  3. Ihr Gerät ist nicht so viel Speicher wie Sie benötigen.

Lösungen:

  1. Sie Ihre Bilder in absteigender Reihenfolge laden können.
  2. Sie können Garbage Collection mit gc() Funktion entfernen.
  3. Wenn einige Objekte nicht verwendet werden, weisen Sie diesen Objekten null zu.
  4. initialisieren Sie keine Objekte in der Schleife.
  5. nicht immer dasselbe Bild erstellen. nur verwenden Referenz des gleichen Bildes, wenn Sie das gleiche Bild verwenden möchten (wenn Sie gleiche Bild in verschiedenen Klasse schaffen dieses Problem auftreten kann)
0

OutOfMemoryException in J2ME, da die Variable kommt, ist nicht seine Speicher frei nach seine Verwendung ist abgeschlossen. Wir können den Speicher für die Variable explizit freigeben.

Nachdem die Aufgabe abgeschlossen ist, geben Sie den Speicher für diese Variable frei. Versuchen Sie nicht, alle Bilder gleichzeitig zu laden. Bild braucht viel Platz im Vergleich zu anderen Variablen. Verwenden Sie daher Bild mit niedriger Qualität und verwenden Sie keine benutzerdefinierte Schriftart in der Systemschrift für die Anwendung.

Verwandte Themen