Как исследовать чрезмерную сборку "мусора" Java

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

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

Проблема состоит в том, что в ходе обрабатывания 400k запроса мое веб-приложение генерирует приблизительно 100 МБ мусора, который заполняет пространство Eden и инициировал молодой набор поколения.

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

Что лучшие инструменты должны использовать, чтобы сделать профилирование памяти Java очень молодых объектов/мусора? Я не могу использовать дампы "кучи", потому что объекты, которыми я интересуюсь, являются мусором.

6
задан mchr 3 July 2010 в 10:07
поделиться

4 ответа

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

Также ознакомьтесь с шаблонами для кэширования преобразователя XSLT.

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

1
ответ дан 17 December 2019 в 18:09
поделиться

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

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


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

2
ответ дан 17 December 2019 в 18:09
поделиться

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

0
ответ дан 17 December 2019 в 18:09
поделиться

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

Обзор

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

  • Новое! Всесторонний монитор использования памяти JVM монитор.
  • Совместимость с JBoss
  • Отображение развернутых приложений, их статус, количество сессий, количество количество объектов, количество контекстных объектов, использование ресурсов данных и т.д.
  • Запуск, остановка, перезапуск, развертывание и обновление приложений
  • Возможность просмотра развернутых JSP файлов
  • Возможность компиляции всех или выбранных JSP файлы в любое время.
  • Возможность предварительной компиляции JSP файлов при развертывании приложения.
  • Новое! Возможность просмотра автоматически сгенерированных JSP-сервлетов
  • Отображение списка сессий для конкретного приложения
  • Отображение атрибутов сессии и их значений для конкретного приложения. Возможность удаления атрибуты сессии.
  • Возможность просмотра контекста приложения атрибуты и их значения.
  • Возможность истечения срока действия выбранных сессий
  • Графический дисплей источника данных детали, включая максимальное количество соединений, количество занятых соединений и детали конфигурации
  • Новое! Возможность группировать свойства источника данных свойства по URL, чтобы помочь визуализировать влияние на базы данных
  • Возможность сброса источников данных в случае если приложение теряет соединение
  • Отображение системной информации включая System.properties, память и сведения об ОС
  • Отображение статуса коннектора JK включая список запросов ожидающих выполнения
  • Графики использования коннектора в реальном времени и статистика.
  • Мониторинг кластера в реальном времени и графики трафика кластера
  • Новое! Использование памяти ОС в реальном времени, своп и мониторинг использования процессора
  • Возможность отображать информацию о файлах журнала и скачивать выбранные файлы
  • . файлах и скачивать выбранные файлы
  • Возможность хвостового просмотра файлов журнала в реальном времени время из браузера.
  • Возможность прерывать выполнение "зависших" запросов без перезапуска
  • Новое! Возможность перезапуска Tomcat/JVM через Java Serview Wrapper.
  • Доступность "Быстрой проверки"
  • Поддержка DBCP, C3P0 и Oracle источников данных
  • Поддержка Tomcat 5.0.x и 5.5.x
  • Поддержка Java 1.4 и Java 1.5
0
ответ дан 17 December 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: