# OutOfMemory-Error? Woran liegt's?



## Hutmacher (13. Okt 2009)

Das hier ist nur ein kleins Programm, was einen behelfsmäßigen Farbverlaufshintergrund zeichnet und dann Hallo auf den Screen schreibt. Drückt man die Taste 5, so steht dort, dass die Taste 5 gedrückt wurde.

Es funktioniert auch alles soweit, nur das Problem:
Ich bekomme immer einem 
	
	
	
	





```
java.lang.OutOfMemoryError: PermGen space
```
-Error ausgegeben! Über Google finde ich nur, dass ich meinen PermGen-Space erhöhen soll usw. Aber das würde mir auf meinem Handy ja auch nicht viel bringen.

Auf dem Handy sieht das Ganze so aus, dass es ca. den halben Farbverlauf drawt und dann stoppt (da ist dann wahrscheinlich der Memory-Leak). 

Habe schon versucht, Speicherplatz zu sparen ... mit Bytes und Shorts x]
Aber woran in meinem Code kann es liegen? Sollte ich vielleicht den Farbverlauf lieber als PNG mitliefern und ihn drawen? Ich meine, wenn es möglich ist, 3D-Spiele auf einem Handy laufen zu lassen, warum geht dann das hier nicht einmal?


```
package hello;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;

public class HelloCanvas extends Canvas
{
   private final static byte DRAW_COMMAND = KEY_NUM5;

   private Graphics screen;
   private Position middle = new Position(getWidth() / 2, getHeight() / 2);
   private boolean fiveWasPressed;

   public void paint(Graphics g)
   {
       if (screen == null)
       {
           this.screen = g;
       }

       drawBackground();
      
       if (fiveWasPressed)
       {
           drawFiveWasPressed();
           fiveWasPressed = false;
       }
       else
       {
           drawHello();
       }
   }
   
   protected void keyPressed(int keyCode)
   {
       if (keyCode == DRAW_COMMAND)
       {
          fiveWasPressed = true;
          repaint();
       }
   }

   private void drawBackground()
   {
       for (short i = 0; i < getHeight(); i += 1)
       {
            screen.setColor(0, i, i);
            screen.drawLine(0, i, getWidth(), i);
       }
   }

   private void drawHello()
   {
       screen.setColor(255, 255, 255);
       screen.drawString("Hello", middle.x, middle.y, Graphics.BASELINE | Graphics.HCENTER);
   }

   private void drawFiveWasPressed()
   {
       screen.drawString("5 was pressed!", middle.x, middle.y, Graphics.BASELINE | Graphics.HCENTER);
   }
}
```


----------



## The_S (13. Okt 2009)

code ...


----------



## Hutmacher (13. Okt 2009)

The_S hat gesagt.:


> code ...


Rofl, ganz vergessen, sry xD


----------



## The_S (14. Okt 2009)

Kopiert, die Position-Klasse ausgetauscht (gibts in Standard Java-ME nicht), ausgeführt: Läuft.


----------



## Hutmacher (17. Okt 2009)

The_S hat gesagt.:


> Kopiert, die Position-Klasse ausgetauscht (gibts in Standard Java-ME nicht), ausgeführt: Läuft.



Danke für's Ausprobieren 
Ich meine, den Fehler gefunden zu haben. Ich arbeite nicht mit Eclipse oder dergleichen, sondern mit dem Java-Me-SDK 3.0 mit integrierter IDE.
Und da habe ich es wohl vielleicht zu oft runnen lassen, ohne es zu terminaten ... jetzt scheint es jedenfalls wieder zu funktionieren.


----------



## The_S (19. Okt 2009)

Hutmacher hat gesagt.:


> Danke für's Ausprobieren



Wollte eigentlich den Fehler reproduzieren, hat so aber nicht geklappt 



Hutmacher hat gesagt.:


> DIch arbeite nicht mit Eclipse oder dergleichen, sondern mit dem Java-Me-SDK 3.0 mit integrierter IDE.



Schrecklich das Teil ... aber ich hab das Programm auch dort getestet, da ich sonst nichts anderes zur Hand hatte.



Hutmacher hat gesagt.:


> Und da habe ich es wohl vielleicht zu oft runnen lassen, ohne es zu terminaten ... jetzt scheint es jedenfalls wieder zu funktionieren.



Normalerweise lässt sich das Programm in dieser tollen IDE nur einmal ausführen. Willst du es ein zweites Mal starten, musst du den Emulator vorher wieder beenden. Kann also durchaus daran gelegen haben. Einen OOME sollte es trotzdem nicht geben. Egal, hauptsache s funktioniert jetzt!

Thread bitte noch als "erledigt" markieren.


----------

