Autor Thema: Frage zur Speicher Nutzung  (Gelesen 2854 mal)

Offline qojote

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • I love YaBB 1G - SP1!
Frage zur Speicher Nutzung
« 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

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Frage zur Speicher Nutzung
« Antwort #1 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.
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline qojote

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • I love YaBB 1G - SP1!
Re: Frage zur Speicher Nutzung
« Antwort #2 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

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Frage zur Speicher Nutzung
« Antwort #3 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
« Letzte Änderung: 26.10.05 - 14:34:46 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Frage zur Speicher Nutzung
« Antwort #4 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
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline qojote

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • I love YaBB 1G - SP1!
Re: Frage zur Speicher Nutzung
« Antwort #5 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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz