我有一个应用程序以相当高的速度泄漏出 Java 堆(400 个用户在 2 小时后留下 25% 的空闲空间......在注销后所有内存都恢复了)并且我们已经确定导致内存泄漏的项目作为放置的字符串在似乎由 Portal 本身生成的 session 中。这些值是经过编码的 Portal URI(非常长的结束编码字符串……通常大小约为 19kb),键似乎是七 (7) 个随机生成的字符,前缀为 RES#
(例如,RES#NhhEY37
).
我们已经使用 session 跟踪逐步完成应用程序并关闭堆转储,这导致确定在几乎每个页面上都创建并添加了这些对象之一......事实上,它似乎是在每个提交数据的页面(大多数页面)。因此,它要么与一般页面 1:1,要么与表单 1:1。
有没有人遇到过类似的问题?我们正在与 IBM 开票,但也想询问这个社区。提前致谢!
最佳答案
它可以是 portlet 缓存吗?您可以激活 servlet 缓存并声明一个长的 portlet 过期时间。引自 techjournal :
Portlet 可以通过在它们的 portlet.xml 描述符 (see Portlet descriptor example) 中设置它们的到期时间来宣传它们被缓存在片段缓存中的能力
<!-Expiration value is in seconds, -1 = no time limit, 0 = deactivated-->
<expiration-cache>3600</expiration-cache> <!- 1 Hour cache -->
要使用片段缓存功能,需要在 WebSphere Application Server 管理控制台的 Web 容器部分激活 servlet 缓存(请参阅 Portlet 描述符示例)。 WebSphere Application Server 还提供了一个缓存监视器企业应用程序 (CacheMonitor.ear),这对于可视化片段缓存的内容非常有用。
更新
您是否有设置 EXPIRATION_CACHE
的 portlet?引用:
在运行时修改本地缓存 对于标准的 portlet,portlet 窗口可以在运行时通过设置 RenderResponse 中的 EXPIRATION_CACHE 属性来修改过期时间,如下所示:
RenderResponse.setProperty(
PortletResponse.EXPIRATION_CACHE,
(new Integer(3000)).toString() );
请注意,这个值对我来说有点违反直觉,-1 表示永不过期,0 表示不缓存。
关于java - WebSphere Portal 中与门户 URI 相关的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087154/