# Java Resourcen Problem (JFrame)



## wwtbunker (1. Sep 2007)

Ich wüsste gerne wie ich allgemein erstellte Instanzen (JFrame,Contäner)uws, Freigeben kann um den genutzten arbeitsspeicher komplett wieder freizugeben.

Bei einer 
	
	
	
	





```
null
```
 setzung oder 
	
	
	
	





```
dispose()
```
 erfolgt keine freigabe des Speichers.
Auch nicht nach einem aufruf des *GB*s.

Anders gesagt was an Instanzen einmal erstellt ist bleibt im speicher bis zum spiel ende.

Habt ja recht ich benutzte nur ein JFrame...... : :bloed:

Hir mal drei Screenshots vom programm EarthDefender.

Die Gegnerschiffe sind noch nicht fertig deswegen hab ich erstmal ein paar aus Quake4 genommen (GEV-usw) 8)
Quake4 Stuff wird in der endversion nicht mehr vorhanden sein.
Werde mir eigene Actoren modelieren.


----------



## Wildcard (2. Sep 2007)

Wo hast du denn vor dein Spiel anzuzeigen wenn du keinen Frame mehr hast?
Weiterhin sagt dieses Snippet herzlich wenig über den Aufbau deines Programms.


> Wieso funktioniert es nur mit Klassen die keinen Extends(?) benutzen? wie die ActorKlassen, ConfigValues usw.


Es gibt keine Klassen ohne extends. Wenn du es nicht dranschreibst ist das ein implizites extends Object


----------



## Guest (2. Sep 2007)

wwtbunker hat gesagt.:
			
		

> SpaceShooter EarthDefender (Mein erstes Java Program)
> Hab vorher mit Quake4 Gebastelt. (Monster,Waffen,Maps/SP/MP,Mods)
> 
> _
> ...


----------



## Wildcard (2. Sep 2007)

http://www.catb.org/~esr/faqs/smart-questions.html


----------



## wwtbunker (2. Sep 2007)

Naja die beiden antworten sind nicht gerade hilfreich Leutz...


----------



## Wildcard (2. Sep 2007)

Solange du nicht in der Lage bist, die zur Beantwortung deiner Frage notwendigen Informationen bereitzustellen, ist dir nicht zu helfen.


----------



## Evil-Devil (2. Sep 2007)

Ich frage mich gerade wieso er mehr als eine JFrame Instanz erstellen will?

Das Beispiel mit Quake 4 hinkt mehr als gewaltig, da dort keinerlei zusätzliche Fensterinstanzen instanziert werden sondern der GUI Renderer lediglich neue Overlays zeichnet wie es halt üblich ist.


----------



## Wildcard (2. Sep 2007)

Auch, der Eingangspost hat sich verändert?
Ja, das wirft tatsächlich die Frage auf warum du mehrere JFrames instanzierst.


----------



## dergrüne (3. Nov 2007)

Mich würde die vom Threat-Ersteller gestellte Frage auch interessieren.

Kämpfe gerade auch damit, das wenn ich ein JFrame dispose() Es im Hintergrund noch vorgehalten wird.

Folgendes kleines Programm:



> import java.awt.BorderLayout;
> 
> import javax.media.j3d.Background;
> import javax.media.j3d.BoundingSphere;
> ...




Und hier die Main


```
public class Main {

	public static void main(String[] args) {
		JFrameTest tmp = new JFrameTest();
		
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		tmp.dispose();
		
	}

}
```

Komischerweise schließt auch das Programm nach dem dispose() nicht. Es bleibt einfach offen und frisst immernoch knapp 40MB speicher. Wenn ich das JFrame mit dem Hintergrundbild (111kb groß) erzeuge. Frisst das Programm schon 42-44MB, mache ich nun einen dispose drauf wird es lediglich um knapp 5MB kleiner. Da kann doch nicht sein.

Was noch lustiger ist modifiziere ich die Main folgendermaßen

```
public class Main {

	public static void main(String[] args) {
		JFrameTest tmp = new JFrameTest();
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		tmp.dispose();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		tmp = new JFrameTest();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		tmp.dispose();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		tmp = new JFrameTest();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		tmp.dispose();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		tmp = new JFrameTest();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		tmp.dispose();
	}

}
```

Wächst das Programm stetig weiter, nachdem alle Frames auf und wieder disposed wurden, hat das Programm gut 50MB gefressen, und das obwohl nix mehr zu sehenn ist.

Kann man ein JFrame irgendwie anders schließen, so das alle referenzen und ressourcen darin freigegebenn werden.

Das ganze interessiert mich in einem anderen Kontext, weil ich bei einer recht großen Java3D Anwendung ein Frame habe was direkt mal 110MB frisst. Nach dem Dispose frisst es aber immernoch 98MB und wenn ich es dann wieder aufrufe kommen locker wieder 40-50MB dabei. Auch alle Interpolatoren darin drehen sich lustig weiter.

Irgendwie macht für mein Verständnis dispose() nicht viel mehr als visible(false).

Kann mir da jemand Licht in die Dunkelheit bringen?

Mfg


----------

