Последнее время на сервере наблюдалась странная картина: CPU поднимался до 100% и не опускался (вебприложение на томкате). Лечилось только ребутом томката. Начал разбираться, включил JMX, подключился JVisualVM, посмотрел на 100% heap, понял, что GC отчаянно пытался освободить удивился тому, что нету OOME на сервере и стянул себе на машину heap dump. Тут начинается самое интересное:
Я пытаюсь открыть этот дамп с поомщью JVisualVM - первый раз падает с OOME. Окей, ставим -J-Xmx2048 - тупит полчаса, потом таки грузит этот дамп, при попытке посмотреть иерархию объектов - опять тупняк на полчаса, через полчаса резолвинга ссылок - вопрос на экране «Хотите ли вы подсчитать суммарный вес обьектов? Это может занять долгое время на больши дампах.» (размер дампа - 1.5Гб). Первый раз я попробовал - через полчаса убил процесс JVisualVM, не дождался. (Комп, смею заметить не сильно древний - 4х-ядерник с 4 гигами памяти, Ubuntu 10.04 x64). Заново полчаса загрузка, полчаса резолвинг ссылок (при чем все остальные приложения пришлось выключить, ибо система просто фризилась и свопилась). Забил.
Получил триальный ключ для YourKit Java Profiler 9.0.7, загрузил в него дамп и через 3 (!!!!) минуты получил полную картину по памяти и сразу нашелся источник проблем.
Я приверженец свободного ПО, но его качество действительно отвратительно. Бесплатные приложения - это все лишь codebase (при условии opensource-ности), но до уровня работающих продуктов мало кто дотягивает.