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?
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
Haben Sie ein ähnliches Problem. Beschrieben hier: http://stackoverflow.com/questions/14610567/memory-leak-spring-3-2-0-release-httpcomponents-4-2-3 – user2023507