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