2010-07-03 1 views
6

У меня есть экземпляр Tomcat, который проявляющий следующее поведение:Как исследовать коллекцию чрезмерной явы мусора

  • Accept один HTTP входящего запроса.
  • Задайте один запрос на серверный сервер и верните около 400 килобайт XML.
  • Пройдите через этот XML и преобразуйте его в 400 КБ JSON.
  • Верните ответ JSON.

Проблема заключается в том, что при обработке запроса 400k мой webapp генерирует около 100 мб мусора, который заполняет пространство Эдена и запускает коллекцию молодого поколения.

Я попытался использовать встроенную функциональность jpro hprof для профилирования сайтов распределения, но Tomcat, похоже, не начал правильно работать с этим. Возможно, я был немного нетерпелив, так как, по-моему, профилирование распределения памяти имеет высокие накладные расходы, поэтому запуск tomcat может занять много времени

Каковы наилучшие инструменты для использования профилей java-памяти для очень молодых объектов/мусор? Я не могу использовать кучи кучи, потому что объекты, которые меня интересуют, это мусор.

ответ

1

Вы можете использовать профилировщик в jvisualvm в JDK для профилирования памяти.

Также обратите внимание на шаблоны для кэширования XSLT-трансформатора.

http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/transform/Templates.html

+0

Профилирование Jvisualvm затруднено, так как мой сервер tomcat работает на linux, и я предпочел бы избежать необходимости запуска его в Windows, где я делаю свою разработку или устанавливаю Linux-ящик gui. – mchr

+2

Установите соответствующий JDK на Linuxbox и перенаправьте jvisualvm для использования сервера X11, работающего на вашем окне. Xming прямо на машине, или Knoppix, работающий на сеансе vmware, работает очень хорошо. –

+2

Также обратите внимание, что если вы добавите соответствующее voodoo для вызова JVM Tomcat, jvisualvm может подключаться из вашей Windowsbox без дальнейшего прощания. –

0

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

+0

Я подозреваю, что мусор недолговечен, и в этом случае было бы чрезвычайно сложно определить, какие биты будут выделены из памяти. Я в идеале хочу что-то вроде визуального vm-профилирования памяти, которое я могу снова запустить мой tomcat-процесс на моем Linux-сервере. – mchr

0

Вы могли бы хотеть попробовать LambdaProbe, который является профайлер для Tomcat. Он поддерживает следующие:

Обзор

лямбда-зонд (ранее Tomcat Probe) является самодостаточным веб-приложение, которое позволяет визуализировать различные параметры, например Apache Tomcat в режиме реального времени. Lambda Probe предназначен специально для работы с Tomcat, поэтому он может получить гораздо больше информации, которая обычно доступна агентам JMX. Вот список функций, доступных через лямбда-зонд:

  • Новое! Всестороннее использование памяти JVM монитор.
  • JBoss совместимость
  • Отображение развернутых приложений, их статус, число сеансов, сеанс счетчик объектов, контекст счетчика объектов, использование источника данных и т.д.
  • Запуск, остановка, перезагрузка, развертывание и updeploy приложений
  • Возможность просмотра развернутых JSP-файлов
  • Возможность компиляции всех или выбранных файлов JSP в любое время.
  • Возможность предварительной компиляции JSP-файлов по развертыванию приложений.
  • Новое! Возможность просмотра автоматически сгенерированных JSP сервлеты
  • Отображение списка сеансов для конкретного применения
  • Отображение атрибуты сеанса и их значения для конкретного применения . Возможность удаления атрибутов сеанса .
  • Возможность просмотра контекста приложения атрибутов и их значений.
  • Возможность истекает для выбранных сессий
  • Графического отображения источника данных детали, включая максимальное количество соединений, число занятых соединений и детали конфигурации
  • Новинки! Возможность группового источника данных свойства по URL, чтобы помочь визуализировать влияние на базы данных
  • Возможность сброса источников данных в случае приложений утечки Connection
  • Отображение системной информации включая System.properties, память бар использования и ОС Подробнее
  • Индикация состояния разъема JK включая список запросов до выполнения решения
  • в реальном времени графики использования соединителя и статистики.
  • Мониторинг кластеров в реальном времени и диаграммы трафика clulster
  • Новинка! В реальном масштабе времени использования памяти ОС, поменять местами использования и использования ЦП мониторинга
  • Возможность показать информацию о журнале файлы и загрузить выбранные файлы
  • Возможность файлов хвост войти реального времени с помощью браузера.
  • Возможность прерывания выполнения «вешать» запросы без сервера restart
  • Новое! Возможность перезапуска Tomcat/JVM через Java Serview Wrapper.
  • Наличие "Быстрая проверка"
  • Поддержка ДБХП, C3P0 и Oracle источников данных
  • Поддержка Tomcat 5.0.x и 5.5.x
  • Поддержка для Java 1.4 и Java 1.5
2

As к реальной проблеме: синтаксический анализ XML может очень сильно зависеть от памяти при использовании парсера, основанного на DOM. Рассмотрим использование парсера, основанного на SAX или binary XML (VTD-XML - это Java API, основанный на этом).

На самом деле, если сопоставление XML-> JSON чистое 1: 1, вы можете также рассмотреть возможность просто прочитать XML и написать JSON в режиме реального времени по строкам, используя небольшой стек.


Вернуться к вопросу: я предлагаю использовать VisualVM для этого. Вы можете найти here статью в блоге, как заставить ее работать с Tomcat.

Смежные вопросы