2009-05-14 7 views
0

Ich jage einen Speicherfehler in einer Anwendung, und es scheint zu den Byte [] -Puffern, die von ServerSocketChannel.accept() generiert werden, verwandt zu sein. Laut jvisvismvm werden von den 505 Megs, die von der Anwendung verwendet werden, über 90% des Speichers von byte [] - Arrays verwendet. Verfolgen Sie es weiter, es gibt 68k + Instanzen von Byte [] und bei weitem die am häufigsten verwendete Größe ist 16681.Java-Server-Socket-Puffer, die nicht auf Mac gesammelt werden

Ich habe eine zufällige Stichprobe dieser Byte-Arrays, und sie alle ohne Ausnahme wurden entweder mit einem InputRecord verwandt oder ein OutputRecord. Wenn ich alle Verweise befolge, kann ich keine finden, die nicht zu einem Finalizer zurückführen, der in meinem begrenzten Verständnis bedeutet, dass das Objekt bereit ist, Müll zu sammeln, aber aus irgendeinem Grund nicht .

Ich wünschte, ich könnte eine Bildschirmaufnahme der jvisualvm-Ausgabe anhängen. Wie auch immer, die referent Objekte umfassen:

  • InputRecord
  • AppInputStream
  • SSLSocketImpl
  • SocketInputStream
  • SocksSocketImpl
  • SocketOutputStream
  • AppOutputStream
  • DelegateHttpsURLConnection
  • HttpsURLConnectionImpl

Dies scheint nur Kunden zu passieren, die Apples VM verwenden. Hat jemand eine Idee, warum diese Puffer keine Müllsammlung bekommen? Liest ich das Heap-Profil falsch? Hacks oder Workarounds?

+0

Ich nehme an, Sie haben close() für diese oder ähnliche Objekte aufgerufen? Wenn Sie in VisualVM nach GC gefragt haben, hat dies den Speicherverbrauch verringert? – akarnokd

+0

Haben Sie ein ähnliches Problem. Beschrieben hier: http://stackoverflow.com/questions/14610567/memory-leak-spring-3-2-0-release-httpcomponents-4-2-3 – user2023507

Antwort

1

finalize wird irgendwann aufgerufen, nachdem das Objekt vom Garbage Collector entdeckt wurde. Die Sun-Implementierung ist mit java.lang.ref verwechselt. Das Schließen von Ressourcen sollte ihren Speicher freigeben. Wenn Objekte mit finalize Verweise auf Puffer beim Schließen nicht aufheben, bleiben diese Puffer so lange hängen, bis der relevante GC nach der Ausführung des Finalisers angezeigt wird.

Im Allgemeinen gibt es nur ein finaliser Gewinde, obwohl die Spezifikation viele erlaubt. Wenn dies aufgrund einer blockierenden Operation, einer unpassenden gehaltenen Sperre oder eines anderen Grundes blockiert wird, wird GC von finalisierbaren Objekten aufgehalten. Ich schlage vor, den finaliser thread in Visualvm zu überprüfen, ob es blockiert ist.

Verwandte Themen