Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Java Arbeitsspeicher bei Filewriter

Empfohlene Antworten

Veröffentlicht

Hallo,

ich hab ein kleines Problem an dem ich nicht weiterkomme. Also ich mache nichts anderes als ganz viele Dateien zur Erzeugen und dort einen kleinen String reinzuschreiben, der auch immer gleich lang ist.

Hier der Programmausschnitt:

for(int i=0;i<anzahl;i++){

String mrn=new_mrn.getMrn(applikation.name.getText());

FileWriter fos3 = new FileWriter(applikation.panel3_auftrag.getText()+"/Auftrag_Simu3_"+mrn+".aut");

fos3.write(mrn);

fos3.close();

}

Das ganze funktioniert soweit, nur ich benutzte, je mehr Dateien ich erzeuge, immer mehr Arbeitsspeicher was ich im Task-Manager beobachten kann.

Kommentiere ich aber den Befehl fos3.write(); raus, bleibt die Speichernutzung konstant. Mir kommt es so vor als würde ich in den RAM schreiben mit dem Befehl write(), aber das mache ich ja nicht, in den Dateien ist ja auch der String. Das Problem ist ich darf den Arbeitsspeicher nicht so in anspruch nehmen.

Ich hab das mal getestet bei 10000 durchläufen ohne fos3.write(); da brauchte ich ca. 1500 KB RAM und das bleibt auch die ganze Zeit konstant, mit dem Befehl fos3.write(); allerdings brauchte ich ca. 13000 KB RAM, und je mehr druchläufe ich mach desto grösser wird der.

Die Datei erzeuge ich ja mit dem FileWriter auch ohne das write, damit schreibe ich ja nur den String rein.

Mache ich da was falsch oder muss ich das irgendwie anders machen?

Danke und Gruß,

Chriz

Mache ich da was falsch oder muss ich das irgendwie anders machen?
Deine Herangehensweise ist absolut in Ordnung. Das einzige, was mir noch auffällt ist dies hier:


  fos3.write(mrn);

  [b]fos3.flush();[/b]   // Zur Sicherheit, falls der Stream nicht auto flushed

  fos3.close();

Was den Speicherverbrauch angeht: Probier mal zwischendurch mit System.gc() den Garbage Collector zu ermutigen seine Arbeit zu tun - vielleicht liegen die Daten einfach nur noch auf dem Heap und genießen die Aussicht :)

Wobei 1,5 MB an RAM für eine normale Java Anwendung schon sehr niedrig ist, ich würde mir da also keine Gedanken machen, das ist alles noch im grünen Bereich.

Hi,

wenn der Speicher stetig bis zur OutOfMemoryException steigt, erzeugst du bei den Methodenaufrufen getMrn(...) und getText() weitere Objecte und hälst irgendwo eine Referenz darauf.


import java.io.*;


public class Test {

	public static void main(String[] args) throws Exception {

		for (int i = 0; i < 50000; i++) {

			String mrn = "blahhhhhshh";

			FileWriter fos3 = new FileWriter("dump/" + i + "ssaaaaa.txt");

			fos3.write(mrn);

			fos3.close();

		}

	}

}

pendelt sich bei mir bei Konstanten 6,5 MB ein.

Gruß Jaraz

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.