В системе IBM iSeries у меня запущена Java-программа - сервер приложений с компонентом веб-сервера, все разработанные внутри компании. При работе на 32-битной или 64-битной JVM J9 (технология IBM для Java) у меня появляются признаки утечки памяти.
Обратите внимание, что проблем с запуском этого программного обеспечения на классической виртуальной машине Java не наблюдается, на нескольких виртуальных машинах Sun / Oracle и на виртуальных машинах Linux. Черт возьми, я регулярно оставляю идентичное программное обеспечение работающим неделями на ноутбуке начального уровня моей жены, пока я работаю над своим веб-сайтом - я могу заверить вас, если у него была утечка памяти, это было бы замечено на этой вещи.
Если я просто оставлю простую систему, работающую без дела, без настроенных приложений (в основном только для системы обмена сообщениями и веб-сервера), куча будет продолжать медленно расти, вызывая выделение большего объема памяти с течением времени, с каждым Цикл GC не совсем накапливается до предыдущего уровня. Шаблон точно такой же для JVM, в которых нет проблем, за исключением того, что на тех, кто выполняет очистку GC, всегда уменьшается куча до своего предыдущего уровня GC.
Но, если я извлекаю системный дамп JVM при запуске после стабилизации и последующих дампов после того, как выделенная куча значительно выросла, дифференциальное сравнение показывает, что после запуска в течение недели больше нет доступных объектов, чем при запуске. Самый последний, через неделю, показывает 6 дополнительных загруженных классов и несколько объектов, явно связанных с этим. Тщательные обзоры всех живых объектов не показали ничего, что могло бы показаться мне неожиданным.
Я пробовал оптимизированные для пропускной способности и параллельные генераторы мусора.
Таким образом, в зависимости от размера кучи задания мы можем просочиться, а в соответствии с дампами кучи ничего не просачивается.
Нет методов, вызываемых JNI (кроме нативного кода, выполняемого как часть основной JVM), и это определенно куча, которая растет - я ясно вижу это в информации IBM WRKJVMJOB, а также в сообщениях с использованием компонентов JMX в моем файле журнала консоли.
Пока что я не могу подключиться к активной JVM с помощью таких инструментов JMX, как JVisualVM, поскольку, хотя сокет прослушивания создается при правильной настройке, соединение отклоняется, по-видимому, на уровне протокола (стек TCP / IP показывает принятый соединение, но JVM его отскакивает).
Я в замешательстве и не знаю, куда идти дальше.
РЕДАКТИРОВАТЬ: просто чтобы уточнить; все эти результаты получены с неинструцированной JVM, потому что я не могу получить доступ JMX к этой JVM (мы работаем над этим с IBM).
РЕДАКТИРОВАТЬ 2011-11-16 19:27: мне удалось получить отчет об активности GC за 1823 цикла GC, который включает в себя конкретные значения для счетчиков Soft / Weak / PhantomReference; в этих цифрах нет признаков безудержного роста. Тем не менее, существует значительный рост в арендуемом пространстве для небольшого объекта (в большом арендуемом пространстве объекта пусто). Он вырос с 9 до 36 млн.