Я управляю веб-приложением среднего размера под tomcat. Я обнаружил, что приложение продолжает сбой после определенного количества времени выполнения (пару дней) из-за проблемы с памятью, я уже увеличил размер кучи, но это не проблема, поскольку я где-то сталкиваюсь с утечкой памяти.JAVAEE - Используемая память кучи просто продолжает расти, пока все не сломается
Я искал способы отладить это безрезультатно. Я использую инструмент под названием YouKit Java, чтобы помочь мне в этом, и я понял, что используемая память кучи продолжает расти неопределенно, пока она не сломается. Коллекция мусора, похоже, не работает в любой момент.
heap memory usage afer 16h Я запустить приложение отладки для всей ночи и даже с минимальными для не использовать это происходит: используется куча растет от нескольких мегабайт до XXX МБ (> 1 Гб в прод) без нагрузки на нем все , После принудительного сбора мусора, использование памяти возвращается к норме.
Следующая картинка показывает используемую память растет снова после моего вынужденного GC с основным использованием приложения: перезагрузки страницы, некоторые получают запросы, которые возвращают данные из БДА (SQLite) и некоторые почтовый запрос, написать в db и откройте некоторые сокеты. Обратите внимание, что для всего, что я тестировал, я также запускаю противоположную команду, которая должна отменить мои изменения. но память просто продолжает расти.
Я сделал снимок памяти, чтобы просмотреть, что такое instanciated. Крупнейшие Доминаторы показывают объектно огромные древовидный объект java.lang.ref.Finalizer, зная, что я всегда не вызывать любой метод Finalize (не то, что я знаю, по крайней мере)
Так что я очень потерял в этом, Java это не моя самая большая сила, и у меня много трудностей, отлаживая это. Мне интересно, есть ли что-то, что может помешать работе GC и вызвать это? (Как я вижу, после принудительного выполнения GC вещи возвращаются в более нормальное состояние). Может ли это быть вызвано самим TOMCAT или джерси?
Боковые заметки о приложении: это API, который позволяет создавать туннель tcp в фоновом режиме (серверные и клиентские сокеты). Каждый туннель порождается в потоке. Кроме того, некоторые данные извлекаются и записываются в sqlite db. Я старался быть уверенным, что все закрыто должным образом (соединения db, запросы, сокеты и неопровержимость ...), когда работа выполнена. Для туннелей, я опираясь на слегка отредактированный вариант библиотеки под названием javatunnel (это может быть также BEW виновника, но не смог найти что-нибудь доказать это)
Запустите jconsole и проверьте, нет ли утечки памяти в вашем приложении. –
каждый объект с финализацией будет завершен Finalizer. любой объект мусора с методом finalizer сначала подключится к Finalizer. вы можете проверить, какие объекты подключаются Finalizer. – andy