Speicherverlust fallen in der Java-Standard-API
, Welche Klassen des Java-Standard-API können zu Speicherverlusten, wenn in einer (nicht offensichtlich) falschen Weg? Und wie können diese Speicherverluste werden vermieden/behoben?
Beispiel: ObjectInputStream
und ObjectOutputStream
halten Referenzen auf alle Objekte, die Sie gesehen haben, um zu senden, spätere vorkommen des gleichen Objekts als Referenzen statt Kopien (und damit befassen sich mit zirkulären Referenzen). Dies verursacht einen Speicherverlust, wenn Sie halten wie einen stream öffnen auf unbestimmte Zeit (z.B. wenn es um die Kommunikation über das Netzwerk).
Update: Rufen Sie reset (), die periodisch oder nach jeder top-level-Objekt.
- vielleicht bewegen Sie Ihr Beispiel, um eine Antwort von sich selbst?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Groß ist, dass immer Teilstrings von Java-strings bezieht sich auf die ursprüngliche Zeichenfolge.
Beispiel: Sie Lesen in einem 3000-Zeichen-record und erhalten eine Teilfolge von 12 Zeichen, zurück an den Aufrufer (innerhalb der gleichen JVM). Auch wenn Sie nicht direkt einen Verweis auf die ursprüngliche-Zeichenfolge, die 12-stellige Zeichenfolge ist immer noch mit 3000 Zeichen im Speicher.
Für Systeme, die empfangen und dann analysieren eine Vielzahl von Nachrichten, kann dies ein echtes problem sein.
Haben Sie ein paar Möglichkeiten, dies zu vermeiden:
oder
Den ersten mehr abgeholzt. Die zweite hat das andere Auswirkungen, weil Sie mit der PermGen space. Überstrapaziert Sie laufen konnte, es sei denn, Sie geben Ihre VM genug.
Denken Sie daran dies ist nur relevant, wenn Sie sind in kleinen Teilfolgen und dann werfen Sie die original-string und Sie tun dies eine Menge.
substring()
intern, wie das Zeug injava.util.regex
.Alles, was Sie sich als Empfänger einer Veranstaltung, z.B. in GUI-frameworks,
kann nicht sein, Müll gesammelt, solange es registriert ist und die Quelle
ist lebendig.
Diese einführen können Speicherlecks, wenn ein Entwickler nicht bewusst, dass
starke Referenz von der Quelle zu den Ereignis-Abonnenten.
Alle nicht-statischen inneren Klassen, die Sie machen, halten Sie äußere Klassen. So, dass unschuldig aussehende innere Klasse zu halten, kann auf eine riesige Objekt graph. Legen Sie die Instanz in einer statischen oder Anwendung-große Sammlung irgendwo, und Sie sind mit einem viel von Speicher, den Sie sind eigentlich nicht zu verwenden.
Jede Instanziierung eines Threads reserviert Speicher für einen Stapel (Standard 512k, abstimmbar über
-Xss
). Es ist nicht ein Leck als solche, aber naive Versuch, stark multi-thread einer Anwendung resultiert in einem beträchtlichen nicht-offensichtliche Verbrauch von Arbeitsspeicher.Jede Klasse mit der dispose () - Methode?
Beispielsweise java.das awt.Fenster#entsorgen:
Verwendung von starken Referenzen, wenn schwache Referenzen ausreichend gewesen wäre. Anwendung und APIs, führen Sie Ihren eigenen Staat-und Ressourcen-management sind die üblichen Schuldigen hier.
Dann, es ist die Verwendung des Observer-Musters, was dazu führen könnte, memory leaks - wenn der Beobachter delists sich aus dem Gegenstand, der Speicher kann nicht zurückgefordert werden, es sei denn, das Thema löst auch der Verweis auf die Betrachter/Hörer. Dies wurde bereits darauf hingewiesen, früher, aber nicht viele Menschen wissen, dass sogar Holzfäller sind Beobachter.
Darüber hinaus dort ist die Wahrscheinlichkeit von Klassen, deren Objekte bei der instanziert werden automatisch in eine statische member. Einige dieser Klassen haben noch nicht einmal ein release() oder dispose () - Methode, so die Referenzen, die weiterhin gehalten werden durch die static-member. Diese Sorte von Speicher-Lecks resultiert schließlich in einer OutOfMemory-Fehler mit einem PermGen space Ausgabe berichtet, als die Ursache, so dass es schwieriger zu diagnostizieren.