Профилировщик YourKit используется для анализа моментального снимка.jstl forEach тег в jBoss 7, утечка памяти?
шаги, которые были проведены (для единственного пользователя):
- номер поколения было увеличено.
- некоторые действия на странице приложения выполнены. большинство из них получают объекты и отображают их через тег jstl forEach.
- выход был выполнен (session.invalidate())
- Время ожидания сеанса устанавливается в 5 минут. поэтому я ждал 6-8 минут, чтобы убедиться, что все в сеансе недействительно.
- был сделан моментальный снимок с помощью профилировщика YourKit.
То, что я обнаружил:
SomeEntity
#3: Captured snapshot JBoss-2014-10-07-1.snapshot 11m 37s - 21m 43s 183 4392 7896
<All the objects> 183 7896
java.lang.Object[] 182 7832
java.util.ArrayList 182 7832
somePath.someImpl 167 7208
java.lang.Object[] 164 7016
java.util.ArrayList 164 7016
org.apache.taglibs.standard.tag.rt.core.ForEachTag 164 7016
somePath.someAnotherImpl 3 192
java.lang.Object[] 3 192
java.util.ArrayList 3 192
org.apache.taglibs.standard.tag.rt.core.ForEachTag 3 192
Что мы можем видеть здесь (пожалуйста, исправить меня, если я ошибаюсь) тег ForEachTag имеет 164 + 3 экземпляров SomeEntity. Я исследовал проблемы jstl и обнаружил, что проблема была воспроизведена. Например, here и here.
Но сначала говорят, что объекты с нулевым значением находятся в doEndTag в порядке, в соответствии с спецификацией jsp (пожалуйста, исправьте меня, если я ошибаюсь). И во-вторых, некоторые проблемы были решены в последней версии 1.2 jstl. В jBoss 7 используется версия 1.2, поэтому, похоже, проблема все еще существует.
Одно из решений - для обнуляемых объектов в doEndTag() считается плохой практикой. See here the reason
Далее я повторил действия, описанные ранее четырьмя различными пользователями. Я мог бы найти, что количество объектов, которые хранятся в org.apache.taglibs.standard.tag.rt.core.ForEachTag, теперь 539 + 12.
Как для меня, это утечка памяти. Если я ошибаюсь, пожалуйста, исправьте меня. Если нет, что мы можем сделать в этом случае? Для обнуления объектов в методе doEndTag?