Das Thema wurde hier glaube ich noch nicht so explizit angesprochen und anschaulich diskutiert. Dieser Thread soll dazu dienen einen einfachen Lösungsansatz zu erhalten für die Problematik, dass Listener die nicht ausgehängt werden können, unnötigerweise Referenzen halten (z.B. auf große Objekte), die eigentlich nicht mehr benötigt werden. Die Folge ist das der GarbageCollector Probleme bekommen kann diese Objekte als nicht mehr länger benötigt zu erkennen -> der Speicher läuft voll.
Dieser Beitrag resultiert aus der in diesem Thread bereits näher erläuterten Problematik: www.java-forum.org/de/topic51357_garbage-collector-funktioniert-nicht-richtig.html
hier nochmal der Beispielcode (nochmal ein klein wenig angepasst), von dem ich mir im Resultat wünschen würde dass er mit WeakReferences so "getuned" wird, dass eine resourcenschone Speichernutzung zur Laufzeit erreicht wird.
hier ein paar Resourcen für alle Interessierten:
java.sun.com/j2se/1.4.2/docs/api/java/lang/ref/WeakReference.html
SUN Article - Tuning Javas Garbage Collection
http://www.javaworld.com/javaworld/javatips/jw-javatip79.html?page=1
Plugging memory Leaks with weak references
---------------------------
Ich Peil im Moment leider garnicht wo ich die WeakReference am besten einsetzen soll? Mein Datenobjekt wird am Beginn von Main() instanziiert, soll ich die WeakReference bereits hier machen? Oder eher in meiner FileOpen() Funktion auf mein Objekt FileParser()? Oder soll ich als Rückgabewert der Funktion eine WeakReference zurückgeben? Habe jetzt schon mehrere Möglichkeiten durchprobiert, bis jetzt ohne Erfolg.
Dieser Beitrag resultiert aus der in diesem Thread bereits näher erläuterten Problematik: www.java-forum.org/de/topic51357_garbage-collector-funktioniert-nicht-richtig.html
hier nochmal der Beispielcode (nochmal ein klein wenig angepasst), von dem ich mir im Resultat wünschen würde dass er mit WeakReferences so "getuned" wird, dass eine resourcenschone Speichernutzung zur Laufzeit erreicht wird.
Code:
// creates at least 64 MB of finest pure garbage
public class MyGarbage{
private byte garbagearray[];
// Construktor
myGarbage(){
garbagearray = new int[67108864];
}
}
Code:
// the GUI class
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
public class AppMain{
public static void main(String[] args) throws Exception
{
MyGarbage garbage;
Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(grd);
shell.open();
// Dropdownmenu
Menu bar = new Menu (shell, SWT.BAR);
shell.setMenuBar (bar);
MenuItem fileItem = new MenuItem (bar, SWT.CASCADE);
fileItem.setText ("&File");
// Submenu
Menu filesubmenu = new Menu (shell, SWT.DROP_DOWN);
fileItem.setMenu (filesubmenu);
// Menuitem Use Memory
MenuItem usemem_item = new MenuItem (filesubmenu, SWT.PUSH);
usemem_item.setText ("Use Memory");
usemem_item.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event e) {
////////////////////////////
// MAKE A LOT OF GARBAGE //
//////////////////////////
garbage = new myGarbage();
}
});
// Menuitem Run GC
MenuItem gc_item = new MenuItem (filesubmenu, SWT.PUSH);
gc_item.setText ("Run GC");
gc_item.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event e)
{
/////////////////////////
// COLLECT GARBAGE !!!//
///////////////////////
Runtime.getRuntime().runFinalization();
System.gc();
Runtime.getRuntime().gc();
}
});
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
}
hier ein paar Resourcen für alle Interessierten:
java.sun.com/j2se/1.4.2/docs/api/java/lang/ref/WeakReference.html
SUN Article - Tuning Javas Garbage Collection
http://www.javaworld.com/javaworld/javatips/jw-javatip79.html?page=1
Plugging memory Leaks with weak references
---------------------------
Ich Peil im Moment leider garnicht wo ich die WeakReference am besten einsetzen soll? Mein Datenobjekt wird am Beginn von Main() instanziiert, soll ich die WeakReference bereits hier machen? Oder eher in meiner FileOpen() Funktion auf mein Objekt FileParser()? Oder soll ich als Rückgabewert der Funktion eine WeakReference zurückgeben? Habe jetzt schon mehrere Möglichkeiten durchprobiert, bis jetzt ohne Erfolg.