Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: qojote am 26.10.05 - 09:19:40

Titel: Frage zur Speicher Nutzung
Beitrag von: qojote am 26.10.05 - 09:19:40
Hi,

ich habe mich gestern mit der Speicherverwaltung unter Java beschäftigt.

jetzt hab ich mich folgendes gefragt

ich erzeuge in einer Schleife ein Object

also
for (int i=0;i<10000000;i++)
{
Object obj=new Object();

weitere code....

}

wenn ich das jetzt laufen lasse wie verhält sich das auf dem Heap ?
würde da Speicher immer sauber auf geräumt ?

Ich habe das so mal laufen lassen mit 1000000000 als parameter in der Schleife und habe mir den Speicher verbrauch angeschaut konnte aber nicht feststellen das da die Nutzung des Speichers hoch gegangen ist.

Ist einfach nur eine Frage zum besseren Verständnis der Speicherverwaltung unter Java.

Gruß
Qojote
Titel: Re: Frage zur Speicher Nutzung
Beitrag von: Ralf_M_Petter am 26.10.05 - 10:44:21
Nun ziemlich einfach und auch so kompliziert. Java besitzt einen Mechanismus der nennt sich Garbage Collector. Dieser sammelt alle Objekte auf, auf die der Benutzer nicht mehr zugreifen kann und gibt deren Speicher wieder frei.


In deinem Beispiel ist es so, sobald du obj mit einem anderen Objekt belegst, geht dir die Referenz auf das vorher darin referenzierte Objekt verloren. Wenn das die letzte Referenz in deinem Programm  war, wird der Garbagge Collector aktiv werden und den Speicher freigeben.

Dazu sagen muß man, dass es unzählige verschiedene Garbagge Collector gibt die sich durch ihre Strategie unterscheiden. Aber mit dem brauchst du dich eigentlich nur zu beschäftigen wenn die Performance ein Problem ist. Bei aktuellen JVM egal ob von IBM oder Sun sind die Defaultmäßigen GC bereits ausserordentlich leistungsfähig und schnell.

Falls du noch Fragen hast gerne.

Grüße

Ralf

P.S. Wir haben heute Feiertag bin also nicht den ganzen Tag online. Sonst gebe ich morgen Antwort.
Titel: Re: Frage zur Speicher Nutzung
Beitrag von: qojote am 26.10.05 - 11:12:14
Hi,

vielen dank für deine Antwort.

Wenn ich nun in der Praxis ein Programm erstelle wäre es besser da so zu machen.
for (int i=0;i<10000000;i++)
{
Object obj=new Object();

weitere code....

}

oder so
Object obj=new Object();
for (int i=0;i<10000000;i++)
{
und hier alle Variablen etc von obj zurücksetzen und neu initialisieren.


weitere code....

}

was ist denn da best practice

Gruß
Qojote
Titel: Re: Frage zur Speicher Nutzung
Beitrag von: flaite am 26.10.05 - 12:25:38
Wichtig bei Garbage Kollektoren ist, dass du nicht weisst, wann der losläuft. Ausserdem kannst du die Größe des Heap Sizes einstellen.
java -xms (initial heap space)
java -xmx (maximal heap space).
Dies kann z.B. in Websphere eine wichtige Tuning-Maßnahme sein.
Profiler können dir anzeigen, wieviel Speicher gerade beansprucht wird, wann der Garbage Collector einsetzt, usw. 
Es ist nicht unbedingt besser einfach mehr Heap-Speicher zu nehmen, weil dann der Lauf des Garbage Collector sehr lange läuft, wenn er startet. Kurze Zyklen sind oft besser.

Zurück zu deiner Frage: Früher konnte man eindeutig sagen, dass 
Code
Object obj=new Object();
for (int i=0;i<10000000;i++)
{
und hier alle Variablen etc von obj zurücksetzen und neu initialisieren.


weitere code....
weniger heap space braucht. Mit den neueren Garbabe Kollektoren ist das nicht mehr so, v.a. weil Objekte, die nur sehr kurz leben auch sehr schnell garbage-collected werden (warum auch immer).
Und ein Programm wird übersichtlicher, wennn Variablen, die tatsächlich nur im Skope der Schleife benötigt werden auch dort initialisiert werden und nicht ausserhalb.

Allgemein wird vor Premature Optimization gewarnt. Es ist in einem gewissen Rahmen immer besser, übersichtlich zu programmieren statt nach oft sowieso nicht alle Aspekte in Betracht ziehenden einfachen Performance-Regeln. Besser ist es, mit Profilern zu arbeiten.

Hier die wirklich große Spezialseite zu Java Performance Tuning:
http://www.javaperformancetuning.com/

Axel
Titel: Re: Frage zur Speicher Nutzung
Beitrag von: Ralf_M_Petter am 27.10.05 - 08:24:22
@qojote!

Auf jeden Fall Variante1. Es kursieren leider im Netz sehr viele Mythen und Gerüchte über die Performance von Java die eigentlich alle von den or Hotspot JVM herrühren. Die meisten Optimierungstrechniken die damals ausgeklügelt worden sind, sind in aktuellen JVM nicht mehr gültig und so gar kontraproduktiv. Die Garbagge Collectoren die in den neuesten JVM egal ob von IBM oder Sun sind so leistungsfähig und schnell, dass ein normaler durchschnittlicher Programmierer es sicher nicht selbst besser machen könnte.

Die Auswahl des Garbagge Collectors die du treffen kannst mit Parametern und die Angabe der Heap Größe richtet sich hauptsächlich nach deiner Anwendung. Es gibt Garbagge Collectoren, die einen sehr hohen Durchsatz erreichen, dafür aber ab und zu Pausen einlegen weil eine große Garbagge Collection fällig wird, oder parallellaufende GCs die praktisch keine Pausen in der Ausführung erzeugen.

Je nach deiner Anwendung musst du dich dann entscheiden, obwohl der Standard schon sehr gut funktioniert.

Weiters war das jetzt eigentlich eine akademische Frage oder hast du ein konkretes Problem. Eventuell kann ich dir auch beim richtigen Problem helfen. Performanceoptimierung in Java ist ein Hobby von mir.

Grüße

Ralf
Titel: Re: Frage zur Speicher Nutzung
Beitrag von: qojote am 27.10.05 - 09:26:32
Hi,

die Frage war halb akademisch halb praktisch.
Ich schreib grad ein Programm und hab mich eigentlich gefragt wie ich es den am besten mache.
Variante 1 ist auf jeden Fall die kürzere und übersichtlichere. Ich war mir aber nicht sicher ob ich mir damit Probleme im Speicher einkaufe.

Vielen Dank für deine / eure Hilfe

Gruß
Qojote