Странная утечка памяти при чтении сериализованных данных в веб-приложении Tomcat - PullRequest
1 голос
/ 14 марта 2011

Я развертываю относительно простое веб-приложение на Tomcat 7.0.8 (JVM 1.6).

Приложение регистрирует ServletContextListener и имеет единственный ресурс под названием «данные», расположенный в WEB-INF.Файл «data» содержит один сериализованный экземпляр простого класса с именем Data.У данных есть несколько открытых полей String и Integer, но больше ничего.Он реализует Serializable и определяет свой собственный serialVersionUID.

В слушателе конкурса contextInitialized () выполняет следующие действия:

  1. Получение InputStream для «данных» из ServletContext,
  2. Создать ObjectInputStream из InputStream,
  3. Считать отдельный объект из ObjectInputStream,
  4. Привести его к типу «Данные»,
  5. Записать значения полей вSystem.out,
  6. Закройте ObjectInputStream и поддерживающий его InputStream.

Кажется, все работает нормально. Однако , когда я останавливаю веб-приложение через приложение менеджера Tomcat, а затем проверяю утечки памяти, Tomcat сообщает мне, что мое приложение просочилось в память, когда оно было остановлено.

Я уверен, что проблема вкласс данных, так как при сериализации строки или целого числа я не вижу утечки.

Есть мысли?

1 Ответ

0 голосов
/ 14 марта 2011

Если этот файл считывается один раз при инициализации веб-приложения, какова значительная утечка памяти?Это даже заслуживает названия?

Утечки памяти значительны для Tomcat и всех серверов приложений, потому что они предназначены для жизни в течение длительного времени.Утечки памяти являются проблемой, только если они обнаруживаются в течение более длительного периода времени.

Ваши инстинкты хороши, но, на мой взгляд, ваши процедуры несовершенны.

Я бы порекомендовал вам использоватьлучший инструмент - Visual VM, который поставляется в комплекте с JDK 6 и выше - и который вы отслеживаете свой Tomcat, когда он используется таким образом, который приближается к вашим реальным производственным потребностям.

Вы не можете сделать никакого вывода относительноутечки памяти из одного запроса.

...