Hi,
ich weis das wurde schon oft in der ein oder anderen Form angesprochen. Ich finde aber leider keinen vernünftigen Post der mir dieses Phänomen so erklärt das ich es lösen könnte, das simple Beispiel das ich weiter unten konstruiert habe widerspricht sich mit all dem was ich über den GC gelesen habe.
Deshalb habe ich das kleine Programm geschrieben, mit dem kann man gut demonstrieren wie sich der Hauptspeicher rapide vollmüllt. Ich finde einfach keine Möglichkeit den Speicher aufzuäumen, und das obwohl das Programm nur sehr wenige Zeilen Code hat und doch eigentlich super überschaubar ist!! ! :autsch:
Das "Programm" hat eigentlich kaum Code, es hat zwei Buttons, mit dem einen erzeugt man "Müll", sprich ein 10M großes Array, mit dem anderen Button ruft man einfach nur den Garbage Collector auf. Der System.gc() tut aber einfach mal garnichts!!! Was ist das für ein Mist???
Referenzen dürfen eigentlich nicht mehr vorhanden sein da der Müll doch eh in einem eigenen Block erzeugt wird, der explizite Aufruf des GC sollte also eh überflüssig sein...?
Ich raffs einfach nicht, es ist zum heulen :bahnhof:
ich weis das wurde schon oft in der ein oder anderen Form angesprochen. Ich finde aber leider keinen vernünftigen Post der mir dieses Phänomen so erklärt das ich es lösen könnte, das simple Beispiel das ich weiter unten konstruiert habe widerspricht sich mit all dem was ich über den GC gelesen habe.
Deshalb habe ich das kleine Programm geschrieben, mit dem kann man gut demonstrieren wie sich der Hauptspeicher rapide vollmüllt. Ich finde einfach keine Möglichkeit den Speicher aufzuäumen, und das obwohl das Programm nur sehr wenige Zeilen Code hat und doch eigentlich super überschaubar ist!! ! :autsch:
Das "Programm" hat eigentlich kaum Code, es hat zwei Buttons, mit dem einen erzeugt man "Müll", sprich ein 10M großes Array, mit dem anderen Button ruft man einfach nur den Garbage Collector auf. Der System.gc() tut aber einfach mal garnichts!!! Was ist das für ein Mist???
Referenzen dürfen eigentlich nicht mehr vorhanden sein da der Müll doch eh in einem eigenen Block erzeugt wird, der explizite Aufruf des GC sollte also eh überflüssig sein...?
Ich raffs einfach nicht, es ist zum heulen :bahnhof:
Code:
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
{
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 //
//////////////////////////
int arraysize = 10000000;
char chararray[] = new char[arraysize];
for(int i=0;i<arraysize ;i++)
chararray[i]=0;
}
});
// 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 !!!//
///////////////////////
System.gc();
}
});
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
}