java - WebSphere Portal 中与门户 URI 相关的内存泄漏

标签 java websphere-portal

我有一个应用程序以相当高的速度泄漏出 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/

相关文章:

jsf - 查看两个不同 portlet 之间的导航?

java - 将验证码与 Spring Security 集成

java - 没有解析对象的Spring ResponseErrorHandler

java - 为什么生成的用于执行操作的 Java 代码运行速度比 "interpreter loop"慢?

java - 如何在不重新启动服务器的情况下更改注释的值

java - 需要垃圾收集开销帮助

java - 具有不同日志级别的不同 java 进程具有相同的 log4j2.xml

java - libGDX actor draw() 未调用

websphere-portal - RAD 8.5 - 没有可用的 Portlet 项目选项

java - 找不到 tld 文件,tld 在共享库中