24 Stimmen

Wiederverwendung von Java-Objekten

Sollten Java-Objekte so oft wiederverwendet werden, wie es möglich ist? Oder sollten wir sie nur dann wiederverwenden, wenn sie "schwergewichtig" sind, d.h. Betriebssystem-Ressourcen mit sich bringen?

Alle alten Artikel im Internet sprechen über die Wiederverwendung von Objekten und das Pooling von Objekten so weit wie möglich, aber ich habe kürzlich Artikel gelesen, die besagen new Object() ist jetzt stark optimiert (10 Anweisungen) und die Wiederverwendung von Objekten ist nicht mehr so wichtig wie früher.

Was ist die derzeit beste Praxis und wie gehen Sie damit um?

17voto

Esko Punkte 28242

Ich lasse den Garbage Collector diese Art von Entscheidungen für mich treffen. Das einzige Mal, dass ich mit frisch zugewiesenen Objekten das Heap-Limit erreicht habe, war nach dem Ausführen eines fehlerhaften rekursiven Algorithmus für ein paar Sekunden, der 3 * 27 * 27 ... neue Objekte so schnell wie möglich generierte.

Tun Sie das, was für die Lesbarkeit und Kapselung am besten ist. Manchmal kann die Wiederverwendung von Objekten sinnvoll sein, aber im Allgemeinen sollten Sie sich darüber keine Gedanken machen.

16voto

OscarRyz Punkte 189898

Wenn Sie sie sehr häufig verwenden intensiv und die Konstruktion ist kostspielig Sie sollten versuchen, sie so oft wie möglich wiederzuverwenden.

Wenn Ihre Objekte sehr klein und billig zu erstellen sind (wie Object), sollten Sie neue Objekte erstellen.

So werden z.B. Verbindungen zu Datenbanken gepoolt, weil die Kosten für die Erstellung einer neuen Verbindung höher sind als die Kosten für die Erstellung einer neuen Integer-Datenbank.

Die Antwort auf Ihre Frage lautet also: wiederverwenden, wenn sie schwer sind UND häufig verwendet werden (es lohnt sich nicht, ein 3-MB-Objekt zusammenzufassen, das nur zweimal verwendet wird)

Bearbeiten:

Darüber hinaus ist dieser Artikel von Effective Java: Unveränderlichkeit bevorzugen ist lesenswert und könnte auf Ihre Situation zutreffen.

9voto

Darron Punkte 20861

Lassen Sie den Garbage Collector seine Arbeit tun, er ist besser als Ihr Code.

Es sei denn, ein Profiler weist sie als schuldig aus. Und versuchen Sie nicht einmal, mit gesundem Menschenverstand herauszufinden, wann es falsch ist. In ungewöhnlichen Fällen sind selbst billige Objekte wie Byte-Arrays besser gepoolt.

  • Regel 1 der Optimierung: Tun Sie es nicht.
  • Regel 2 (nur für Experten): Tun Sie es noch nicht.

9voto

Thomas Morgner Punkte 151

Die Erstellung von Objekten ist billig, ja, aber manchmal nicht billig genug.

Wenn Sie viele (und ich meine wirklich VIELE) temporäre Objekte in schneller Folge erstellen, sind die Kosten für den Garbage Collector beträchtlich. Doch selbst mit einem guten Profiler sind die Kosten nicht unbedingt leicht zu erkennen, da der Garbage Collector heutzutage in kurzen Intervallen arbeitet, anstatt die gesamte Anwendung für ein oder zwei Sekunden zu blockieren.

Die meisten Leistungsverbesserungen, die ich in meinen Projekten erzielen konnte, kamen entweder durch Vermeidung der Objekterstellung oder durch Vermeidung der gesamten Arbeit (einschließlich der Objekterstellung) durch aggressives Caching zustande. Egal wie groß oder klein das Objekt ist, es braucht immer noch Zeit, um es zu erstellen und die Referenzen und Heap-Strukturen dafür zu verwalten. (Und natürlich nehmen auch die Aufräumarbeiten und das interne Heap-Defragmentieren/Kopieren Zeit in Anspruch).

Ich würde nicht anfangen, religiös zu werden, wenn es darum geht, die Schaffung von Objekten zu vermeiden alle Kosten, aber wenn Sie ein Puzzlemuster in Ihrem Speicher-Profiler sehen, bedeutet das, dass Ihr Garbage Collector auf Hochtouren läuft. Und wenn Ihr Garbage Collector die CPU in Anspruch nimmt, ist die CPI für Ihre Anwendung nicht verfügbar.

Bezüglich der Zusammenführung von Objekten: Es ist schwierig, es richtig zu machen und nicht in Speicherlecks oder ungültige Zustände zu geraten oder mehr Zeit für die Verwaltung aufzuwenden, als man sparen würde. Daher habe ich diese Strategie nie verwendet.

Meine Strategie bestand darin, einfach unveränderliche Objekte anzustreben. Unveränderliche Dinge können leicht zwischengespeichert werden und helfen daher, das System einfach zu halten.

Aber egal, was Sie tun: Stellen Sie sicher, dass Sie Ihre Hotspots zuerst mit einem Profiler überprüfen. Vorzeitige Optimierung ist die Wurzel allen Übels.

3voto

Yuval Adam Punkte 155168

Als Faustregel sollte man seinen gesunden Menschenverstand walten lassen und Objekte wiederverwenden, wenn ihre Erstellung einen erhebliche Mittel wie E/A, Netzwerkverkehr, DB-Verbindungen usw..

Wenn es nur um die Erstellung einer neuen String() Vergessen Sie die Wiederverwendung, Sie werden nichts davon haben. Die Lesbarkeit des Codes hat höheren Vorrang.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X