Java Resourcen Problem (JFrame)

Status
Nicht offen für weitere Antworten.

wwtbunker

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

Bei einer
Code:
null
setzung oder
Code:
dispose()
erfolgt keine freigabe des Speichers.
Auch nicht nach einem aufruf des GBs.

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.

bild1.jpg


bild2.jpg


bild3.jpg
 
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
 
wwtbunker hat gesagt.:
SpaceShooter EarthDefender (Mein erstes Java Program)
Hab vorher mit Quake4 Gebastelt. (Monster,Waffen,Maps/SP/MP,Mods)


In dem Spiel werden mehrere frames benutzt, (Voreinstellungen[300/500], HauptSpiel[800/600]).
Ich möchte wissen wie ich mit mehrfachFrames Optimiert arbeiten kann.


Wie kann ich die von (frame) benutzten resourcen (ArbeitsSpeicher)
nach der nutzung des JFrame wieder Freigeben???...
Allso das Fenter Komplett entfernen...

Nach der nutzung des Frames möchte ich es Komplett entfernen.
Mit den unten genannten Befehlen gibt es keine wirkung 8(

Code:
frame.finalize();
frame.dispose();
frame = null;
System.gc();

Ich will nicht das Programm Beenden nur das Fenster (Intro,Mainmenu,usw) Freigeben.

Ist echt wichtig für mich weil mein spiel nicht mehr als 64MB Arbeitsspeicher benutzten soll.

Bei den Spiel, Actoren wie (gegnerschiffe und asteroiden) Klassen ohne SuperKlasse funzt es wunderbar und man sieht während des Spiel den genutzten speicher grösser und kleiner werden.

Darf ich (frame) nicht KlassenGlobal Deklarieren, Die Actoren sind bestandteile eines Arrays der wenn es nötig ist den actor Freigibt,
zum beispiel wenn er den bildschierm verlassen hat, oder abgeschossen wurde.

Ich habe mehrere Variablen (Instanzen) bei den das Problem Nervt wie (Das Intro, das Mainmenu, die VorConfiguration, usw).

Bitte Helf mir jemand mit nen Syntax Beispiel Danke
 
Solange du nicht in der Lage bist, die zur Beantwortung deiner Frage notwendigen Informationen bereitzustellen, ist dir nicht zu helfen.
 
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.
 
Auch, der Eingangspost hat sich verändert?
Ja, das wirft tatsächlich die Frage auf warum du mehrere JFrames instanzierst.
 
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;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.swing.JFrame;
import javax.vecmath.Point3d;

import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;


public class JFrameTest extends JFrame{

private static final long serialVersionUID = 1L;
private Canvas3D c3d;
public JFrameTest(){
super("test");
setSize(1280,1024);
getContentPane().setLayout(new BorderLayout());
// Jetzt kommt der 3D-Teil
c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration()); //So am besten
SimpleUniverse simpleU = new SimpleUniverse (c3d); //Das VirtualUniverse, hier wird auch schon der View hinzugefügt
simpleU.getViewingPlatform().setNominalViewingTransform(); //Versetzt die Kamera so, dass man gleich etwas sehen kann
BranchGroup scene = new BranchGroup();
simpleU.addBranchGraph (scene);
add(BorderLayout.CENTER,c3d);
setVisible(true);

simpleU.addBranchGraph(createSceneGraph());
}

public BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
BoundingSphere bigBound = new BoundingSphere(new Point3d(),100);
objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
//Hintergrund
TextureLoader backgroundTexture = new TextureLoader(".\\grafic\\stars.jpg", this);
Background background = new Background(backgroundTexture.getScaledImage(1280, 1024));
background.setApplicationBounds(bigBound);
objRoot.addChild(background);

return objRoot;
}
}


Und hier die Main

Code:
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
Code:
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben