Garbage Collector beschleunigen

Status
Nicht offen für weitere Antworten.
P

pope

Gast
Hallo liebe Forencommunity

Ich hab folgendes Problem:

ich arbeite bei meinem Projekt viel mit großen und vor allem sehr zahlreichen Objekten die aber nur sehr kurzlebig sind und meist kurz nach der Erstellung wieder unbrauchbar sind und jede Referenz darauf demnach gelöscht wird, und sie sehr bald, in großer Zahl und Größe dem Garbage Collector zum Opfer fallen.

Irgendwie kommt der Garbage Collector nicht mehr ganz nach und die ganze VM wird lame.
Kann man den irgendwie boosten bzw. schneller machen?

Das mit den Objekten lässt sich leider nicht anders lösen, ist nicht anders zu bewerkstelligen.


Danke für jede hilfreiche Antwort

Gruß

pope
 
G

Gast

Gast
object pooling könnte evtl. helfen, wenn der GC nicht mehr nachkommt. guck dir z.b. mal das flyweight pattern an
 

tfa

Top Contributor
Zahlreiche kurzlebige Objekte belasten den GC fast überhaupt nicht. Ich vermute, es ist zu wenig Speicher reserviert. Mit welchen Parametern (-Xmx, -Xmx) startest du das Programm?
 

ARadauer

Top Contributor
flyweight pattern, sprich nciht immer neue objekte anlegen sondern diese wiederverwenden..
zb die felder in einer jtable sind jlabels, das sind aber in einer 100x100 tabelle nicht 100x100 sondern das ist immer das selbe objekt

edit: ups, wurde schon genannt, hab ich übersehen
 

der JoJo

Bekanntes Mitglied
@ARadauer
Wie soll das mit den labels gehen?
Wenn jedes Label einen andern text hat, kann das ja schlecht alles das selbe label sein ...
 

Marco13

Top Contributor
Es IST dasSELBE Label. Das Label wird (wie auch in Dokus und Tutorials steht) als "Stempel" verwendet. Wenn die Table gezechnet wird, wird von der TableCellRenderer.getCellrendererComponent-Methode (im allgemeinen) immer dasSELBE Label zurückgeliefert - nur mit einem anderen Text. Sinngemäß ist das sowas wie
Code:
paintTable
{
    label.setText("0,0");
    paintAt(0,0, label);
    label.setText("0,1");
    paintAt(0,1, label);
    ....
}
 
G

Guest

Gast
Naja, wenns automatisch und immer passiert ist das ja was anderes. Aber wie soll man das auf komplexe Objekte umlegen?
 
G

Guest

Gast
Kim Stebel hat gesagt.:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

erster treffer bei google-suche nach garbage collector tuning. kommt man da nicht selbst drauf??

nicht jeder spricht fließendes technisch-Englisch.
Und auf Tuning muss man auch erstmal kommen...
 

FArt

Top Contributor
Anonymous hat gesagt.:
Kim Stebel hat gesagt.:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

erster treffer bei google-suche nach garbage collector tuning. kommt man da nicht selbst drauf??

nicht jeder spricht fließendes technisch-Englisch.
Und auf Tuning muss man auch erstmal kommen...

Na ja, dann gibts du "garbage collection" bei google ein, nimmst den ersten Treffer (Wikipedia auf deutsch), liest den Artikel durch und findest den selben Link unten in der Linksammlung. Somit fällt dir "tuning" in die Hände...

Bezüglich deinem Englisch: erwartest du, dass dir hier jemand den ganzen Artikel übersetzt? Wenn du ihn nicht lesen/verstehen kannst, sollte das jemand anderes aus dem Projekt machen.

Aber die junge Generation ist einfach nicht groß genug, somit muss die alte Generation wieder ran ... doppel :wink:
 

tfa

Top Contributor
Bleibt nur noch die Frage, ob die Lösung des Problems überhaupt irgendwas mit GC-Tuning zu tun hat...
 
G

Guest

Gast
FArt hat gesagt.:
Anonymous hat gesagt.:
Kim Stebel hat gesagt.:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

erster treffer bei google-suche nach garbage collector tuning. kommt man da nicht selbst drauf??

nicht jeder spricht fließendes technisch-Englisch.
Und auf Tuning muss man auch erstmal kommen...

Na ja, dann gibts du "garbage collection" bei google ein, nimmst den ersten Treffer (Wikipedia auf deutsch), liest den Artikel durch und findest den selben Link unten in der Linksammlung. Somit fällt dir "tuning" in die Hände...

Bezüglich deinem Englisch: erwartest du, dass dir hier jemand den ganzen Artikel übersetzt? Wenn du ihn nicht lesen/verstehen kannst, sollte das jemand anderes aus dem Projekt machen.

Aber die junge Generation ist einfach nicht groß genug, somit muss die alte Generation wieder ran ... doppel :wink:

Ich brauch das ja nicht, aber Kim kommt immer mit irgendwelchen google-Hinweisen daher die einem, wenn sie einem wirklich mal konkret weiterhelfen, nicht so ohne weiters eingefallen wären.
Darum gehts mir. Ich lies seit etwa 2 Monaten hier mit und das ist mir immer wieder aufgefallen.
 
G

Guest

Gast
Ich vergaß: oft stellt er die spezifischsten Sachen als völlig selbstverständlich hin, das meinte ich.

Ok, auf Tuning hätt man kommen können. Aber das ist auch nur ein Begriff in einer Reihe von anderen.
 
G

Guest

Gast
Ja darum gehts eigenltich.

Er tut immer so als wärs selbstverständlich, als würds einen anspringen was man in google eintippen muss.
 

Kim Stebel

Bekanntes Mitglied
Es tut mir ja sehr leid wenn ich jemandem hier zu nahe komme, aber das war das _erste_ was ich bei google eingetippt habe. Inklusive Beitrag schreiben hat mich das alles keine 2 Minuten gekostet. Und "tuning" kennt sogar mein 60jähriger Nachbar, der kein Wort Englisch spricht. ;)
 

Kim Stebel

Bekanntes Mitglied
Ob das jetzt die ultimative Lösung ist weiß ich auch nicht, aber zumindest mal ein Ansatz. Vielleicht geht es ja auch mit pooling besser...
 
G

Guest

Gast
Ja ok, Tuning wär nun wirklich nicht so schwer zum herausfinden gewesen.

Aber du nimmst so oft Dinge als selbstverständlich an die in nem >Anfängerforum< nunmal nicht selbstverständlich sind und verweist dann oft auf Begriffe die man "doch als allererstes bei google eingeben würde" von denen ein Java Neuling noch nie was gehört hat.

Wenn einer immer wüsste was er suchen sollte würd er hier nicht posten in diesem, <Anfängerforum>.
Zum Anfang is es oft auch schwer für dich absolut logische Dinge zu googeln, weil man sie ganz einfach noch nicht kennt, oder auch Begriffe die man zur richtigen Lösungsfindung kennen sollte nicht richtig verknüpfen kann. Denn man ist ein >>Anfänger<< im >>Anfängerforum<<.

WEißt was ich mein?
 
G

Guest

Gast
Ich will dich damit nicht persönlich angreifen, keineswegs. Aber oft schätzt du die Schlucht zwischen deinem Wissen und Anfängerwissen einfach zu klein und setzt (an sich zwar oft wirklich grundlegende ) Begriffe voraus, die noch nicht jedem bekannt sind der hier Rat sucht.
 

Kim Stebel

Bekanntes Mitglied
also wenn jemand einen begriff nicht kennt, den ich benutze, kann er den ja mal nachschlagen. und wenn er es dann nicht versteht, erkläre ich es ihm sogar noch, versprochen;)

zurück zum thema?
 
G

Guest

Gast
Du solltest erstmal herausfinden, ob das ganze überhaupt mit dem GC zu tun hat. Starte Dein Programm mal folgendermaßen:

java -verbose:gc Startklasse

Dann schreibt der Garbage Collector auf die Konsole, wenn er aktiv wird. Wenn man z.B. in einer Schleife 1.000.000 Mal ein String-Objekt erzeugt
Code:
public class Garbage
{
	public static void main(String[] args)
	{
		for (int i=0; i<1000000; ++i)
		{
			new String("test");
		}
	}
}
dann erscheint folgende Ausgabe
Code:
[GC 896K->106K(5056K), 0.0010469 secs]
[GC 1002K->106K(5056K), 0.0004014 secs]
[GC 1002K->106K(5056K), 0.0002151 secs]
[GC 1002K->106K(5056K), 0.0000919 secs]
[GC 1002K->106K(5056K), 0.0000901 secs]
[GC 1002K->106K(5056K), 0.0000863 secs]
[GC 1002K->106K(5056K), 0.0000893 secs]
[GC 1002K->106K(5056K), 0.0000843 secs]
[GC 1002K->106K(5056K), 0.0000892 secs]
[GC 1002K->106K(5056K), 0.0000844 secs]
[GC 1002K->106K(5056K), 0.0000885 secs]
[GC 1002K->106K(5056K), 0.0000848 secs]
[GC 1002K->106K(5056K), 0.0001027 secs]
[GC 1002K->106K(5056K), 0.0000878 secs]
[GC 1002K->106K(5056K), 0.0000959 secs]
[GC 1002K->106K(5056K), 0.0000890 secs]
[GC 1002K->106K(5056K), 0.0000923 secs]
[GC 1002K->106K(5056K), 0.0000911 secs]
[GC 1002K->106K(5056K), 0.0000976 secs]
[GC 1002K->106K(5056K), 0.0000950 secs]
[GC 1002K->106K(5056K), 0.0000873 secs]
[GC 1002K->106K(5056K), 0.0000968 secs]
[GC 1002K->106K(5056K), 0.0000859 secs]
[GC 1002K->106K(5056K), 0.0000895 secs]
[GC 1002K->106K(5056K), 0.0000852 secs]
[GC 1002K->106K(5056K), 0.0000908 secs]
Du siehst also, dass kurzlebige Objekte die Lieblingsspeise des Garbage Collectors sind. 40.000 Objekte frisst der in weniger als einer Millisekunde (nach kurzer Warmlaufzeit braucht er sogar nur noch eine Zehntel-Millisekunde).

Fred
 
G

Gast

Gast
naja, einfacher kannst du es dem GC auch gar nicht machen ;) verwurste mal ein paar millionen objekte (nicht String), die sich gegenseitig referenzieren. dann gibt er ziemlich schnell auf.
 

FArt

Top Contributor
Anonymous hat gesagt.:
Du siehst also, dass kurzlebige Objekte die Lieblingsspeise des Garbage Collectors sind. 40.000 Objekte frisst der in weniger als einer Millisekunde (nach kurzer Warmlaufzeit braucht er sogar nur noch eine Zehntel-Millisekunde).

Fred

Falsch und richtig zugleich. Ich habe das schon in der Bemerkung meines letzten Postings angedeutet.

Der Poster redet von vielen großen, kurzlebigen Objekten.

Neue Objekte werden in der young generation angelegt. Sterben sie auch hier wieder, können sie schnell abgeräumt werden, weil hier der Algorithmus für den GC entsprechend effizient implementiert werden kann. Sonst wandern sie über den survivor space in die tenured generation (old generation, ...). Die Erklärung ist nicht ganz korrekt, genauer bitte bei SUN nachlesen.

Wann können keine neuen Objekte in der young generation angelegt werden? Wenn der Platz ausgeht! Genau dann werden auch kurzlebige Objekte direkt als tenured angelegt. Jeder GC dort dauert aber viel länger (full GC).

Auf jeden Fall war der Tipp gut, die GC Zeiten ausgeben zu lassen, um zu sehen wo der Hammer hängt.
 
P

pope

Gast
Danke für den Tipp mit der GC-Ausgabe.
Werd mir das mal genauer ansehen.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben