【发布时间】:2014-12-01 19:39:40
【问题描述】:
YourKit profiler 用于分析快照。
已执行的步骤(针对唯一用户):
- 代数已增加。
- 应用程序页面上的一些操作已完成。他们中的大多数都通过 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。
但根据 jsp 规范,起初据说 doEndTag 中不可为空的对象是可以的(如果我错了,请纠正我)。其次,在最新的 1.2 jstl 版本中解决了一些问题。 jBoss 7使用的是1.2版本,看来问题还是存在的。
解决方案之一 - 将 doEndTag() 中的可空对象视为一种不好的做法。 See here the reason
接下来,我重复了 4 个不同用户之前描述的操作。我可以发现 org.apache.taglibs.standard.tag.rt.core.ForEachTag 持有的对象数量现在是 539+12。
至于我,这是内存泄漏。如果我错了,请纠正我。如果不是,在这种情况下我们能做什么?要在 doEndTag 方法中为 null 的对象吗?
【问题讨论】:
标签: java memory-leaks jstl profiling jboss7.x