Советы по производительности и памяти JSP Struts - PullRequest
1 голос
/ 05 декабря 2008

Я работаю над базовым приложением на основе Struts, которое испытывает большие скачки в памяти. У нас есть инструмент мониторинга, который замечает один запрос на пользователя, добавляющий 3 МБ в память кучи JVM. Есть ли какие-либо советы, которые помогут быстрее собрать мусор, освободить память или повысить производительность?

Приложение является базовым приложением Struts, но в отчете JSP много строк, поэтому может быть создано много объектов. Но это не то, чего вы раньше не видели.

  1. Выполнить набор запросов к базе данных.
  2. Создать сериализованный объектный объект POJO. Это представляет собой строку.
  3. Добавить строку в список массивов.
  4. Установить список массива для объекта формы при вызове действия.
  5. Логика JSP будет перебирать список из ActionForm, и данные отображаются пользователю.

Примечания:
1. Форма находится в области видимости сеанса и, возможно, в массиве данных (возможно, это проблема).
2. Боб POJO содержит около 20 полей, включая данные String или BigDecimal.

Отчет может содержать от 300 до 1200 строк. Так что, по крайней мере, создано много объектов.

Ответы [ 3 ]

2 голосов
/ 05 декабря 2008

Учитывая предоставленную вами информацию, я предполагаю, что вы обычно загружаете от 1 до 2 мегабайт данных для результата: 750 строк * 20 полей * 100 байт на поле = 1,4 МБ. Теперь рассмотрим все временные объекты, необходимые между базой данных и конечной разметкой. 3 Мб не удивительно.

Меня бы волновало только то, что эта память, похоже, протекла; то есть следующая сборка мусора в пространстве молодого поколения не собирает все эти объекты.

0 голосов
/ 27 апреля 2009

Я полагаю, что проблема в массиве данных в ActionForm, который должен выделять огромный кусок памяти. Я хотел бы записать результаты запроса непосредственно в ответ: прочитать строку из набора результатов, написать в ответ, прочитать следующую строку, написать и т. Д. Может быть, это не MVC, но для вашей кучи это было бы лучше: -)

ActionForms хороши для операций CRUD, но для отчетов ... Я так не думаю.

Примечание: если ActionForm имеет область видимости = сеанс, экземпляр будет жив (вместе с огромным массивом) до истечения сеанса. Если область действия = запрос, экземпляр будет доступен для GC.

0 голосов
/ 26 декабря 2008
  1. Элемент списка

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

Если количество записей велико и общий набор записей занимает много памяти, рассмотрите возможность использования разбивки на страницы отчета.

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

  1. Сборка мусора является дорогостоящим процессом как он сканирует всю память.

  2. Большинство производственных серверов будет быть настроенным на уровне JVM, чтобы избежать явная сборка мусора

...