Hi,
ich suche vor allem wegen speichersparendem Programmieren Tips für Java. Gibt es da Beispiele und Anleitungen?
Danke
Bonkers
Hi,
ich suche vor allem wegen speichersparendem Programmieren Tips für Java. Gibt es da Beispiele und Anleitungen?
Danke
Bonkers
ich suche vor allem wegen speichersparendem Programmieren Tipps
für Java. Gibt es da Beispiele und Anleitungen?
Solche Tipps-Seiten gibts zwar einige für Performance, aber für Speicher habe ich sowas noch nicht gesehen.
Hab allerdings auch noch nicht wirklich gesucht, viel gibts zu dem Thema IMHO nicht zu sagen. Einfach wenig Speicher allokieren, dann verbrauchst du auch wenig. Also nirgendwo überflüssig Speicher allokieren (z. B. 10000 Objekte anlegen von denen du dann meistens nur 100 verwendest, selbes gilt für Array-Initialisierungen etc.).
Ein guter, allgemeiner Link in Sachen Java-Performance wäre z. B.: http://www.mathtools.net/Java/Performance/
Für die eigentliche Analyse sind Profiler ganz brauchbar, ich verwende Sitraka JProbe (http://www.sitraka.com), der hat auch einige Funktionen in Sachen Speichermonitoring drinnen. Allerdings geht es da eher um zu oftes allokieren und deallokieren, also wiederum die Performance-Sicht.
Grüße, Robert
Solche Tipps-Seiten gibts zwar einige für Performance, aber
für Speicher habe ich sowas noch nicht gesehen.
Ja, das hab ich leider auch schon feststellen müssen.
Hab allerdings auch noch nicht wirklich gesucht, viel gibts zu
dem Thema IMHO nicht zu sagen. Einfach wenig Speicher
allokieren, dann verbrauchst du auch wenig. Also nirgendwo
überflüssig Speicher allokieren (z. B. 10000 Objekte anlegen
von denen du dann meistens nur 100 verwendest, selbes gilt für
Array-Initialisierungen etc.).
Ja, das klingt logisch, nur leider habe ich eine übles Problem beim laden von Bildern. Der Speicher wächst zusehens an wenn ich hintereinader Bilder lade. selbst Image.flush() bringt nicht viel.
Ein guter, allgemeiner Link in Sachen Java-Performance wäre z.
B.: http://www.mathtools.net/Java/Performance/
Danke, werd ich mit mal anschauen.
Für die eigentliche Analyse sind Profiler ganz brauchbar, ich
verwende Sitraka JProbe (http://www.sitraka.com), der hat auch
einige Funktionen in Sachen Speichermonitoring drinnen.
Allerdings geht es da eher um zu oftes allokieren und
deallokieren, also wiederum die Performance-Sicht.
Danke, probier ich mal.
Grüße, Robert
Gruß und besten Dank Jörn
Eventuell hast du auch einfach nur ein Problem mit dem Garbage Collector, es kann sein, dass Objekte zwar von der Anwendung „freigegeben“ wird aber aufgrund ungünstiger Umstände nicht schnell genug vom GC gelöscht werden.
Zu dem Thema kannst du dir z. B. mal:
http://java.sun.com/docs/hotspot/
anschauen.
Grüße, Robert
Moin
Ja, das klingt logisch, nur leider habe ich eine übles Problem
beim laden von Bildern. Der Speicher wächst zusehens an wenn
ich hintereinader Bilder lade. selbst Image.flush() bringt
nicht viel.
poste mal die wichtigen Zeilen aus deinem Code, oder beschreib was du genau mit den Bildern machts.
Der ganze Quelltext wäre zu viel zum Posten. Ich habe 3 Images die ich in einem eigens dafür erstellten Panel zeichnen lasse. Die Images werden in einem anderen Panel geladen und dann übergeben. Die 3 Bilder sind zwischen 1200x1000 und 100x100 groß. Habe jetzt mehrmals Image.flush() drin, dadurch ist die Applikation „nur“ noch 40 MB groß(Heap).
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Moin
Der ganze Quelltext wäre zu viel zum Posten. Ich habe 3 Images
die ich in einem eigens dafür erstellten Panel zeichnen lasse.
Die Images werden in einem anderen Panel geladen und dann
übergeben.
„anderes Panel“ ?? wieso den das ??
Die 3 Bilder sind zwischen 1200x1000 und 100x100
groß. Habe jetzt mehrmals Image.flush() drin, dadurch ist die
Applikation „nur“ noch 40 MB groß(Heap).
also max 14,4 MB (3x 1200x1000x32 bit).
teste mal folgenden code:
(...im "init" vom Prog.)
Panel Anzeige = new MyPanel()
MediaTracker ME = new MediaTracker (Anzeige);
Toolkit TK = Toolkit.getDefaultToolkit()
Image I1 = TK.createImage("filename1");
Image I2 = TK.createImage("filename2");
Image I3 = TK.createImage("filename3");
ME.addImage (I1,1);
ME.addImage (I2,2);
ME.addImage (I3,3);
try {
ME.waitForAll();
}catch (.....){....}
Anzeige.setImages (I1,I2,I3);
(...Ende "init")
und als Klasse MyPanel:
public void paint (Graphics g){
g.drawImage (I1,x1,y1,...);
g.drawImage (I2,x2,y2,...);
g.drawImage (I3,x3,y3,...);
}
Durch den Mediatracker wird dann nämlich nur eine gerenderte Version des Bildes erzeugt, und diese ist dann auch die richtige für’s drawImage(). Wenn du zuerst irgendwelche „dummy“-Panels benutzt werden die Images zuerst für die dummy gerendert und dann, später für das eigentliche Panel. Bau bei dem Code keinen flush ein, sonst seit man nichts auf dem Schirm…
Wenn ein Bild vergrössert (verkleinert) werden soll kann man das dem Mediatracker auch gleich als Info. mitgeben, das spart auch Speicher. Die gerenderte Version ist dann gleich auf der richtigen Grösse. (Für jede Grösse muss neu gerendert werden, das braucht jedesmal Platz).
Setz bei dem Code kein flush() ein es sein denn du bist sicher dass das Image in allen im Moment gerenderten Versionen nicht mehr gebraucht wird.
Ausserdem kann man noch mit Paramentern beim Aufruf von java eine maximale Stack-grösse festlegen. Damit kann man gc() zum schnelleren Arbeiten bringen.
viel Glück & cu.
DANkE!
DANkE!