Я охочусь за ошибкой памяти в приложении и, похоже, связан с буферами [], сгенерированными ServerSocketChannel.accept(). Согласно jvisualvm, из 505 мегабайт, используемых приложением, более 90% памяти используется массивами byte []. Отслеживая его дальше, есть 68k + экземпляры байта [], и, безусловно, самый общий размер - 16681.Буферы сокетов Java-сервера, которые не являются мусором, собранным на Mac
Я сделал случайную выборку этих байтовых массивов, и все они без исключения были связаны либо с InputRecord или OutputRecord. Если я следую всем ссылкам, я не могу найти ничего, что не приведет к Finalizer, который в моем ограниченном понимании означает, что объект готов к сбору мусора, но он не по какой-то причине ,
Хотелось бы, чтобы я мог прикрепить захват экрана выхода jvisualvm. Во всяком случае, объекты референта включают в себя:
- InputRecord
- AppInputStream
- SSLSocketImpl
- SocketInputStream
- SocksSocketImpl
- SocketOutputStream
- AppOutputStream
- DelegateHttpsURLConnection
- HttpsURLConnectionImpl
Это похоже на клиентов, использующих виртуальную машину от Apple. Кто-нибудь знает, почему эти буферы не собирают мусор? Я читаю профиль кучи неправильно? Взломы или обходные пути?
Предполагаете, вы вызвали close() на эти или связанные объекты? Если вы попросили GC в VisualVM, уменьшилось ли потребление памяти? – akarnokd
Имейте аналогичную проблему. Описан здесь: http://stackoverflow.com/questions/14610567/memory-leak-spring-3-2-0-release-httpcomponents-4-2-3 – user2023507