OutOfMemoryError bei statischer Methode und ArrayList

cl0udt

Lt. Junior Grade
Registriert
Sep. 2008
Beiträge
508
JAVA - OutOfMemoryError bei statischer Methode und ArrayList

Hi Leute,

ich möchte aus einer statischen Methode heraus eine andere statische Methode aufrufen (insert), die mir ein Objekt in eine schon bestehende (objList) einsortiert, die auch statisch ist.

Leider bekomme ich schon bei einer Liste mit mehr als 10 Elementen einen java.lang.outofmemoryerror: Java heap space.

Mit unter 10 Elementen geht es. Vorher hab ich einfach mit Collections.sort gearbeitet, damit ging es, aber ich wollte die performance erhöhen, falls ich einen Array mit extrem vielen elementen habe. Dachte anstatt sort zu benutzen (java benutzt dabei mergesort), wäre meine methode schneller, indem ich einfach nur einsortiere. Die Elemente sind zu Beginn komplett sortiert, einmal ganz zu beginn benutze ich Collections.sort!

Was mach ich falsch?

Code:
public static ArrayList<Object> ObjList;

public static blabla(){
Collections.sort(ObjList);
while(bla){
   //macht irgendwas, wird mind. ObjList.size() / 2 Mal aufgerufen 
    insertObj(obj)
   }
}

public static void insertObj(Object obj){
 boolean added = false;
 if (ObjList.size() < 1){
   Obj.add(obj);
   }
   else {	
      for (int x = 0; x < ObjList.size(); x++){
            if (Obj.getOccurence() < ObjList.get(x).getOccurence()){
                 ObjList.add(x, Obj);
                 added = true;
         }
    }
       if (!added) ObjList.add(Obj);
    }
 }
 
Zuletzt bearbeitet:
Ich hau das gleich mal in Eclipse und debug das, aber meine Vermutung ist dass dein ObjList.add(Obj); dazu führt dass dein While mehr durchgeht als es sollte -> OOM :)
Ergänzung ()

Ehm, keine Chance das zu debuggen solange du nicht den original code bereitstellst. Das haut an so vielen Stellen nicht hin, dass ich nicht mehr sicher sein kann, dass eine Korrektur noch was mit deinem Code zu tun hat.
 
while(bla) //bla = true
{
irgendwas();
}

public void irgendwas(){
//tu irgendwas
}

du musst hald in der irgendwas dein bla irgendwann auf false setzten ansonsten haste ne endlosschleife
 
die while-schleife bricht definitiv ab. Ich lösche aus der Liste bei jedem durchgang 2 objekte und füge nur eins wieder hinzu. die whileschleife läuft nur solange ObjList.size() > 1 ist... vorher hatte ich statt der methode insertObj(Obj) einfach collections.sort auf die liste aufgerufen, nachdem ich das object eingefügt hatte, aber das kommt aufs gleiche raus. es klappt ja auch, wie gesagt, mit listen bis zu 10 objekten. Nur mit mehr nicht....
 
naja dann solltest du einen vollständigen code posten nicht aus fragmenten die nicht zusammenpassen wenn du while(bla) schreibst geh ich davon aus das des i bool is
da du diesen wert nie änderst hast du ne endlosschleife
wenn du also hilfe brauchst post und bitte vollständig den code
 
Das ganze sieht mehr wie ein verkorkster Versuch aus, ein Set zu implementieren...

Abgesehen davon, ist folgendes Codefragment völlig verkorkst:
Code:
for (int x = 0; x < ObjList.size(); x++){
            if (Obj.getOccurence() < ObjList.get(x).getOccurence()){
                 ObjList.add(x, Obj);
                 added = true;
         }
}

Du iterierst über die Länge der Arraylist und fügst ständig neue Elemente dazu... Diese Schleife wird nie abbrechen, da bei jeder Iteration ObjList.size() neu abgefragt wird! Dadurch kriegste deine OOM Exception...

Du solltest die Länge der Arraylist vorher in ner separaten Variable auslesen...
 
Zuletzt bearbeitet:
jo hab dieses fragment nichtmal so richtig beachtet aber stimmt genau
da ist auchn fehler drinnen war von dem while bla zu iritiert xD

wobeis mir alle haare aufstehlt wenn ich nur die benutzte benamsung seh
 
Jope, hab die sachen umbenannt, kann net den ganzen Code posten, is viel zu viel. Aus dem array werden in "blabla" immer 2 objekte zu einem zusammengefügt, die 2 alten objekte ausm array gelöscht und in insertObj soll dann das zusammengeführte korrekt eingefügt werden, da ist kein denkfehler drin. Aber lasst gut sein leute. Hab eigentlich keine lust mehr, von meinen "verkorksten" versuchen zu lesen, oder was sich bei euch so alles aufstellt, wenn ihr mein variablennamen lest ;). Hab kein problem mit kritik, aber bevor ich mich hier als depp hinstellen lasse, lass ich es lieber mit collections.sort einsortien und dann gehts auch. Nichts für ungut, trotzdem danke. ;)
 
Du lässt dich jetzt bitte nicht nach jedem Einfügen sortieren oO
Du hast einfach das break in der for vergessen, baus halt rein, und es sollte gehen!
 
naja -.- post ich einfach nixmehr wenn der th das nicht will
 
Zuletzt bearbeitet:
@cl0udt

Es geht nicht darum, dass wir Dich in irgendeiner Form als "Deppen" hinstellen, auch wenn so manch ein Post, das vielleicht erfordern würde.

Nein, es geht darum dass du Hilfe brauchst bzw. sie angefordert hast. Es sind auch genug Leute da, die Dir helfen wollen. Nur musst du, vor allem bei Programm-Code, immer ein funktionierendes Beispiel liefern. Immer! Sonst kann Dir nur schwer bis gar nicht geholfen werden - außer es geht nur Grundsätzliche Fragen wie "Class.getSunshine(Gott myGod)" und wo man nun die Klasse "Gott" her bekommt.

Ein Tipp von mir für das nächste Mal.
Schreib eine "Proof-Of-Error" ( Klasse, die genau dein Problem darstellt. Lass gerne alles weg, was nichts damit zu tun hat oder "zu viel ist". Hauptsache dein Klasse zeigt und produziert genau den Fehler den du von uns analysiert und behoben haben willst.

Manchmal reicht es schon aus, dass man solch eine "Proof-Of-Error" Klasse schreibt, um zu merken wo der Fehler ist.

Gruß,
Nox
 

Ähnliche Themen

Zurück
Oben