Hi,
habe da ein kleines Speicher Problem. Und zwar habe ich ein Menü mit Java3D auf einer canvas3D (AWT Komponente) augebaut.
Die Klasse ist von JFrame abgeleitet und erzeigt ein komplett neues JFrame und bekommt eine canvas3D geaddet.
So wenn ich nun aus dem Menü in ein anderes Fenste rmöchte mache ich natürlich menue.dispose(). Das Fenster etc.
verwindet auch, aber wenn man sich mal den Speicher anschaut, wird nur ein marginaler Bruchteil wieder frei.
Wenn ich jetzt von dem anderen Menü zurück will zum Menü gibts eine OutOfMemoryException: Java heap space.
Also habe ich das Programm mal mit java -Xms 512m gestartet und da komme ich wieder zurück in Menü, allerdings ist
das Menü nicht neu augebaut worden. Sondern alle interpolatoren ect. sind noch beim Alten.
Obwohl ich menue = new Menue3D() mache ?!
Also habe ich mir gedacht, evtl. habe ich irgendwoe noch referencen wodurch der GC nicht korrekt anspringt.
Also habe ich mir erstmal folgendes kleines Programm geschrieben:
Wenn man das laufen lässt und den Taskmanager beobachtet sieht man, dass der Speicher immer voller wird, glaube es
startet mit 16 MB und hört bei 19 MB. Nach meinem Verständnis sollte der GC aber doch dafür sorgen, dass am Ende
wieder 16 MB frei sind, oder?
Also irgendwie gibt dispose nicht alles wieder frei, sondern nur bestimmte ressourcen.
Gibt es da was anderes, wie ich den Speicher wieder freigebe?
In meinem Java3D beispiel, habe ich bei geladenem Menü 110MB verbrauch, nachdem ich das Fenster dispost habe,
braucht es immernoch 98MB, dass kann doch nicht normal sein?!
Mfg
der Grüne
habe da ein kleines Speicher Problem. Und zwar habe ich ein Menü mit Java3D auf einer canvas3D (AWT Komponente) augebaut.
Die Klasse ist von JFrame abgeleitet und erzeigt ein komplett neues JFrame und bekommt eine canvas3D geaddet.
So wenn ich nun aus dem Menü in ein anderes Fenste rmöchte mache ich natürlich menue.dispose(). Das Fenster etc.
verwindet auch, aber wenn man sich mal den Speicher anschaut, wird nur ein marginaler Bruchteil wieder frei.
Wenn ich jetzt von dem anderen Menü zurück will zum Menü gibts eine OutOfMemoryException: Java heap space.
Also habe ich das Programm mal mit java -Xms 512m gestartet und da komme ich wieder zurück in Menü, allerdings ist
das Menü nicht neu augebaut worden. Sondern alle interpolatoren ect. sind noch beim Alten.
Obwohl ich menue = new Menue3D() mache ?!
Also habe ich mir gedacht, evtl. habe ich irgendwoe noch referencen wodurch der GC nicht korrekt anspringt.
Also habe ich mir erstmal folgendes kleines Programm geschrieben:
Code:
import javax.swing.JButton;
import javax.swing.JFrame;
public class JFrameTest extends JFrame{
public JFrameTest(){
super("test");
JButton test = new JButton("Hallo");
add(test);
setSize(200,200);
setVisible(true);
}
public static void main(String[] args) {
JFrameTest test;
for(int i=0;i<=300;i++){
test = new JFrameTest();
System.out.println(i);
try {
test.dispose();
System.gc();
test.finalize();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Wenn man das laufen lässt und den Taskmanager beobachtet sieht man, dass der Speicher immer voller wird, glaube es
startet mit 16 MB und hört bei 19 MB. Nach meinem Verständnis sollte der GC aber doch dafür sorgen, dass am Ende
wieder 16 MB frei sind, oder?
Also irgendwie gibt dispose nicht alles wieder frei, sondern nur bestimmte ressourcen.
Gibt es da was anderes, wie ich den Speicher wieder freigebe?
In meinem Java3D beispiel, habe ich bei geladenem Menü 110MB verbrauch, nachdem ich das Fenster dispost habe,
braucht es immernoch 98MB, dass kann doch nicht normal sein?!
Mfg
der Grüne