Hallo,
ich bin gerade dabei Java zu lernen und beschäftige mich nun schon geraume Zeit damit. Ich kenne mich aber noch nicht ganz so gut damit aus wie z.B. C/C++ oder Assembler.
Ich bin gerade dabei eine kleine GUI-Anwendung (swing) als ersten Gehversuch zu schreiben, mit der ich den Inhalt einer Datei in einer JTextArea anzeigen lassen kann. Dazu habe ich einen Button definiert, mit dem sich über seine ActionListener eine Methode "void DateiOeffnen()" ein JFileChooser öffnen lässt. Mit diesem wird eine Datei geöffnet, zeilenweise in einen String geschrieben und dieser dann in einer JTextArea angezeigt. Das Ganze wurde mit javac compiliert und in eine JAR Datei gepackt.
Dies funktioniert auch alles so, wie es soll.
Mein Problem dabei ist, dass wenn eine neue Datei geöffnet wird der Arbeitsspeicher nicht wieder freigegeben wird.
Das Programm selbst erstellt einen Windows Prozess mit ca. 50MB Arbeitsspeicherverbrauch. Wenn ich jetzt eine Datei mit 350 KB Größe öffne, verbraucht der Prozess ca. 380 MB(!) Arbeitsspeicher. Wenn ich anschließend eine winzige 1KB Datei öffne, sind immer noch 380 MB Arbeitsspeicher belegt. Dieser wird erst wieder freigegeben, wenn ich das Programm schließe.
Die Variablen werden immer wieder verwendet (direkt unter der Klasse definiert). Und ich habe auch alle neu erzeugten Objekte am Ende immer wieder gleich null gesetzt, so dass diese keinen Speicherplatz mehr verbrauchen sollten. Dies scheint nicht zu funktionieren.
Lange Rede, kurze Frage: wie bekomme ich Objekte zuverlässig wieder gelöscht, so dass diese nachdem sie nicht mehr benötigt werden keinen Speicherplatz mehr benötigen?
Hier mal ein Code-Beispiel von meiner Methode:
ich bin gerade dabei Java zu lernen und beschäftige mich nun schon geraume Zeit damit. Ich kenne mich aber noch nicht ganz so gut damit aus wie z.B. C/C++ oder Assembler.
Ich bin gerade dabei eine kleine GUI-Anwendung (swing) als ersten Gehversuch zu schreiben, mit der ich den Inhalt einer Datei in einer JTextArea anzeigen lassen kann. Dazu habe ich einen Button definiert, mit dem sich über seine ActionListener eine Methode "void DateiOeffnen()" ein JFileChooser öffnen lässt. Mit diesem wird eine Datei geöffnet, zeilenweise in einen String geschrieben und dieser dann in einer JTextArea angezeigt. Das Ganze wurde mit javac compiliert und in eine JAR Datei gepackt.
Dies funktioniert auch alles so, wie es soll.
Mein Problem dabei ist, dass wenn eine neue Datei geöffnet wird der Arbeitsspeicher nicht wieder freigegeben wird.
Das Programm selbst erstellt einen Windows Prozess mit ca. 50MB Arbeitsspeicherverbrauch. Wenn ich jetzt eine Datei mit 350 KB Größe öffne, verbraucht der Prozess ca. 380 MB(!) Arbeitsspeicher. Wenn ich anschließend eine winzige 1KB Datei öffne, sind immer noch 380 MB Arbeitsspeicher belegt. Dieser wird erst wieder freigegeben, wenn ich das Programm schließe.
Die Variablen werden immer wieder verwendet (direkt unter der Klasse definiert). Und ich habe auch alle neu erzeugten Objekte am Ende immer wieder gleich null gesetzt, so dass diese keinen Speicherplatz mehr verbrauchen sollten. Dies scheint nicht zu funktionieren.
Lange Rede, kurze Frage: wie bekomme ich Objekte zuverlässig wieder gelöscht, so dass diese nachdem sie nicht mehr benötigt werden keinen Speicherplatz mehr benötigen?
Hier mal ein Code-Beispiel von meiner Methode:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class GUI extends JPanel... {
// Dateivariablen
File Datei;
FileReader DateiReader;
BufferedReader DateiBufferedReader;
int DateiRueckgabeWert;
String DateiName, DateiPfad, DateiAbsolut, DateiInhalt, DateiLine;
...
hier steht alles, was die GUI Elemente betrifft.
...
void DateiOeffnen() {
dateidialog = new JFileChooser();
DateiRueckgabeWert = dateidialog.showOpenDialog(null);
// Abfrage, ob auf "Öffnen" geklickt wurde
if(DateiRueckgabeWert == JFileChooser.APPROVE_OPTION) {
Datei = dateidialog.getSelectedFile();
DateiName = Datei.getName();
DateiPfad = Datei.getParent();
DateiAbsolut = DateiPfad + "\\" + DateiName;
// Ausgabe des Dateipfad und -namen der ausgewaehlten Datei
textfeld_dateiinfo.setText(DateiAbsolut);
// Dateiinhalt in die zentrale Textarea schreiben
DateiInhalt = "";
try {
DateiReader = new FileReader(Datei);
DateiBufferedReader = new BufferedReader(DateiReader);
while ((DateiLine = DateiBufferedReader.readLine()) != null){
DateiInhalt += DateiLine;
DateiInhalt += "\n";
}
DateiReader = null;
DateiBufferedReader = null;
}
catch(Exception e){
e.printStackTrace();
}
textarea1.setText(DateiInhalt);
dateidialog = null;
}
}
}