2008-12-04 3 views
1

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

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

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

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

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

ответ

0
  1. пункт Список

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

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

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

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

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

+0

Кроме того, я скажу, что GC для запуска не существует никакой гарантии, что он будет работать. – tom 2013-07-19 17:27:03

2

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

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

0

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

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

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