Speichernutzung wohl nicht richtig verstanden?

Status
Nicht offen für weitere Antworten.

Marcellus

Mitglied
Hi!
Anscheinend habe ich die Speicherbenutzung von JAVA noch nicht richtig verstanden, da ich in bestimmten Faellen eine "java.lang.OutOfMemoryError: Java heap space"-Fehlermeldung bekomme.
Mein Programm soll Folgendes machen:
Es liest eine bestimmte Anzahl von Namen aus einer Datenbank und schreibt diese Zeilenweise in eine Datei. Danach liest es die neu erstellte Datei zeilenweise ein, holt fuer den entsprechenden Namen am Anfang der Zeile die dazugehoerigen Ergebnisse aus einer bestimmten Ergebnistabelle, fuegt diese der Zeile an und schreibt diese Zeile dann jeweils in eine neue Datei. Dieser Prozess wird in einer for-Schleife fuer mehrere Ergebnistabellen wiederholt. Hier der (gekuerzte) Code (ist schon stark durcheinander, da ich wild rumprobiert habe und die Testausgaben, die ich mir gemacht habe, habe ich auch dringelassen):
Code:
"File mit Namen (inFile) wurde erzeugt!"
"for each toolID" (gekuerzt){
                                        ...
					System.out.println("beforeMd: "+((Runtime.getRuntime().totalMemory() - 
							Runtime.getRuntime().freeMemory())/1024) + " von " +
							(Runtime.getRuntime().totalMemory()/1024));
					String[] md = ds.get_MetaClustMetaData(toolID, wlCGR);
					if (md!=null) {
						numberOfColumns = md.length;
						logr.debug("Reading tmpFile and adding to each line " +
								"the corresponding result line of the tool " +
								"with the id: "+toolID);
						//read the old file and write it + the new data 
						//in a new file
			    		try {
			    			System.out.println("beforeFrBr: "+((Runtime.getRuntime().totalMemory() - 
			    					Runtime.getRuntime().freeMemory())/1024) + " von " +
			    					(Runtime.getRuntime().totalMemory()/1024));
			    			br = new BufferedReader(new FileReader(inFile));
			    			fw = new BufferedWriter(new FileWriter(outTmpFile));
			    			System.out.println("createdBrFr: "+((Runtime.getRuntime().totalMemory() - 
			    					Runtime.getRuntime().freeMemory())/1024) + " von " +
			    					(Runtime.getRuntime().totalMemory()/1024));
			    			
			    			// write the MetaData line first
			    			line = br.readLine();
			    			s = new StringBuilder(100000);
				        	s.append(line);
				        	for (int j=0; j<numberOfColumns; j++) {
				        		s.append("\t").append(md[j]);
				        	}
				        	s.append(lineSep);
		    				fw.write(s.toString());
		    				fw.flush();
		    				md = null;
		    				System.out.println("mdNull: "+((Runtime.getRuntime().totalMemory() - 
		    						Runtime.getRuntime().freeMemory())/1024) + " von " +
		    						(Runtime.getRuntime().totalMemory()/1024));
//		    				s = null; //NEW
			    			seqIdx = 0;
			    			s.replace(0, s.length(), "");
			    			// now write the results of the module for 
			    			// each sequence
			    			System.out.println("Gehe jetzt in while-Schleife!");
//------------in dieser while-Schleife wird die Speichernutzung aufgeblaeht-----------------------------
					        while ((line = br.readLine()) != null) {  
					        	s.append(line);
				        		tmp = ds.get_MetaClustResults(toolID, 
				        				seqSet.getSequenceIdAt(seqIdx), 
				        				wlCGR);
				        		for (int j=0; j<numberOfColumns; j++) {
					        		s.append("\t").append(tmp[j]);
					        	}
					        	s.append(lineSep);
			    				fw.write(s.toString());
			    				fw.flush();
			    				tmp = null;
			    				s.replace(0, s.length(), "");
//			    				s = null; //NEW
			    				seqIdx++;
				    		}
					        System.out.println("Bin aus while-Schleife raus!");
					        System.out.println("ausW: "+((Runtime.getRuntime().totalMemory() - 
									Runtime.getRuntime().freeMemory())/1024) + " von " +
									(Runtime.getRuntime().totalMemory()/1024));
					        if (seqIdx+1!=numberOfRows) {
					        		logr.fatal("Different numbers of rows!");
					    			System.exit(28);
					        }
			    		}
			    		catch ( IOException e ) {
			    			logr.fatal("Couldn't create outTmpFile: " +
			    												outTmpFile);
			    			System.exit(29);
			    	    }
			    	    finally {
				    	    	try {
				    	    		if (fw != null) fw.close();
				    	    		if (br != null) br.close();
				    	    	} 
				    	    	catch (IOException e) {
				    	    		logr.error("Couldn't close outTmpFile: " +
				    	    										outTmpFile);
				    	    		//System.exit(30);
				    	    	}
			    	    }
			    	    fw = null;
			    	    br = null;
			    	    System.out.println("fwBrNull: "+((Runtime.getRuntime().totalMemory() - 
			    				Runtime.getRuntime().freeMemory())/1024) + " von " +
			    				(Runtime.getRuntime().totalMemory()/1024));
			    	    //delete the old file
			    	    File f = new File(inFile);
			    	    f.delete();
			    	    logr.debug("Rename the new tmpFile into the old " +
			    	    										"tmpFile.");		
			    	    File cp = new File(outTmpFile);
			    	    copied = cp.renameTo(new File(inFile));
			    	    if (!copied) {
			    	    		logr.fatal("Couldn't copy the file to the " +
			    	    								"new filename!");
				    	    	System.exit(39);
			    	    }
					}
					else {
						logr.fatal("MetaData result set is empty!");
						System.exit(37);
					}
}
...
Ich hoffe, ich habe alles wichtige hier drin!
Der JVM gebe ich -Xmx1024m mit!
Lasse ich das Programm fuer 500 Sequenzen (Namen) laufen -> klappt's!
2000 -> klappt auch!
Lasse ich das Programm fuer etwas ueber 9000 Sequenzen laufen, bekomme ich folgende Ausgabe (auch gekuerzt):


  • 371 [main] DEBUG metaclust.Clusterer - Getting all sequence names...
    1764 [main] DEBUG metaclust.Clusterer - Writing tmpFile with sequence names...
    1939 [main] DEBUG metaclust.Clusterer - Finished writing the sequence names into the tmpFile.
    1941 [main] DEBUG metaclust.Clusterer - Starting for-loop over the tool ids...
    forLoop: 4364 von 9016
    beforeMd: 4364 von 9016
    1984 [main] DEBUG metaclust.Clusterer - Reading tmpFile and adding to each line the corresponding result line of the tool with the id: 1
    beforeFrBr: 4364 von 9016
    createdBrFr: 4404 von 9016
    mdNull: 4611 von 9016
    Gehe jetzt in while-Schleife!
    Bin aus while-Schleife raus!
    ausW: 14254 von 15124
    fwBrNull: 14254 von 15124
    3167 [main] DEBUG metaclust.Clusterer - Rename the new tmpFile into the old tmpFile.
    forLoop: 13841 von 24808
    beforeMd: 13841 von 24808
    3254 [main] DEBUG metaclust.Clusterer - Reading tmpFile and adding to each line the corresponding result line of the tool with the id: 2
    beforeFrBr: 13841 von 24808
    createdBrFr: 13873 von 24808
    mdNull: 14069 von 24808
    Gehe jetzt in while-Schleife!
    Bin aus while-Schleife raus!
    ausW: 55885 von 69956
    fwBrNull: 55885 von 69956
    5433 [main] DEBUG metaclust.Clusterer - Rename the new tmpFile into the old tmpFile.
    forLoop: 55374 von 98992
    beforeMd: 55374 von 98992
    5668 [main] DEBUG metaclust.Clusterer - Reading tmpFile and adding to each line the corresponding result line of the tool with the id: 3
    beforeFrBr: 55374 von 98992
    createdBrFr: 55374 von 98992
    mdNull: 55569 von 98992
    Gehe jetzt in while-Schleife!
    Bin aus while-Schleife raus!
    ausW: 205076 von 285980
    fwBrNull: 205076 von 285980
    11220 [main] DEBUG metaclust.Clusterer - Rename the new tmpFile into the old tmpFile.
    forLoop: 197573 von 353240
    beforeMd: 197573 von 353240
    11916 [main] DEBUG metaclust.Clusterer - Reading tmpFile and adding to each line the corresponding result line of the tool with the id: 4
    beforeFrBr: 197573 von 353240
    createdBrFr: 197573 von 353240
    mdNull: 197573 von 353240
    Gehe jetzt in while-Schleife!
    Bin aus while-Schleife raus!
    ausW: 777539 von 1012480
    fwBrNull: 777539 von 1012480
    29302 [main] DEBUG metaclust.Clusterer - Rename the new tmpFile into the old tmpFile.
    forLoop: 764902 von 1040512
    beforeMd: 764902 von 1040512
    32650 [main] DEBUG metaclust.Clusterer - Reading tmpFile and adding to each line the corresponding result line of the tool with the id: 5
    beforeFrBr: 764902 von 1040512
    createdBrFr: 764902 von 1040512
    mdNull: 764902 von 1040512
    Gehe jetzt in while-Schleife!
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Wie Ihr seht schein der speicherfressende Teil in der while-Schleife zu sein. Jedoch dachte ich eigentlich, dass ich alle benutzten Objekte, Arrays und Variablen immer wieder "null" setze und der Speicher dadurch immer wieder frei werden sollte. Das scheint irgendwie nicht der Fall zu sein. Nach jeder While-Schleife ist die Speichernutzung deutlich erhoeht und wird leider nicht wieder erniedrigt. Ich habe auch zu Anfang jedes for-Loops (und auch zwischendurch manchmal_ den GC laufen lassen, aber leider hat das ueberhaupt nichts gebracht. Das inTmp-File ist bei Programmabruch 33MB gross und das outFile, in das er gerade schreibt, ist bei Abbruch immer 14MB gross. Aus der 1. Tabelle zieht er eine Spalte, aus der 2. 16, aus der 3. 64, aus der 4. 256 und aus der 5. Tabelle 1024 Spalten. In allen Tabellen und Spalten habe ich kurze Strings.
Koennt Ihr mir helfen und sagen, was ich falsch verstehe und warum der Speicher nicht wieder frei gegeben wird? Seht Ihr den Fehler (in der while-Schleife)? Warum blaeht er sich in der while-Schleife so dermassen auf, obwohl ich alles Zeilenweise mache und manches "null" setze. Und wieso gibt er nach der while-Schleife den Speicher nicht wieder her, obwohl ich auch da eigentlich alles auf "null" setze? Was verstehe ich da nicht richtig bei der Speichernutzung?[/list][/code]
 

Marcellus

Mitglied
Vielleicht, weil ich noch nicht so der Programmier-Guru bin. Kann gut sein, dass es zu kompliziert ist. Bin fuer jeden Tipp zur Verbesserung dankbar!
 
G

Guest

Gast
Koenntest Du das etwas ausfuehren? Das sagt mir beides nicht viel. Danke.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Booleanfeld Speichernutzung J2ME Allgemeine Java-Themen 2
O NullPointerException (wohl Denkfehler) Allgemeine Java-Themen 5
V Comparator (steh wohl aufm Schlauch) Allgemeine Java-Themen 12
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
OnDemand MemoryLeak nicht zu finden Allgemeine Java-Themen 26
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Micha43 Applet *.jar läuft nicht auf dem Mac Allgemeine Java-Themen 8
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
N nicht static und auch nicht new Allgemeine Java-Themen 3
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
AleXusher Hauptklasse startlösung konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 1
G @PostConstruct Annotation nicht mehr gültig ? Allgemeine Java-Themen 7
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
izoards log4j2 will nicht.... Allgemeine Java-Themen 15
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
I serialVersionUID - explizit vergeben oder nicht? Allgemeine Java-Themen 6
MiMa Vorhandenes das nicht existiert?? Allgemeine Java-Themen 7
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
T Fremde Typen mockt man nicht? Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
D Twitch API mit HttpURLConnection läuft nicht? Allgemeine Java-Themen 0
M Test geht auf Travis und mit Github Action schief aber nicht lokal Allgemeine Java-Themen 3
R Threads Clip loop loopt nicht Allgemeine Java-Themen 2
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand JMS Messages nicht abgeholt Allgemeine Java-Themen 0
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
A Mp3 Player funktioniert nicht Allgemeine Java-Themen 0
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
M Console geht nicht auf (Windows 10) Allgemeine Java-Themen 3
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
W Javac nicht bei Installation installiert Allgemeine Java-Themen 9
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Java.exe exestiert, aber irgendwie auch nicht Allgemeine Java-Themen 11
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
X JNA funktioniert nicht mehr Allgemeine Java-Themen 4
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8

Ähnliche Java Themen


Oben