WebSphere Portal中与Portal URI相关的内存泄漏

时间:2010-01-18 15:40:54

标签: java websphere-portal

我有一个应用程序以相当不错的速度泄漏了java堆(400个用户在2小时后释放25%免费...在注销后所有内存都恢复了)并且我们已经确定了因为Strings放置导致内存泄漏的项目在会话中似乎由Portal本身生成。这些值是编码的门户网站URI(非常长的终端编码字符串...通常大小约为19kb),并且密钥似乎是由RES#作为前缀的七(7)个随机生成的字符(例如,RES#NhhEY37 )。

我们使用会话跟踪和抢占堆转换来逐步执行应用程序,这导致确定在几乎每个页面上都创建了这些对象中的一个并添加到会话中......实际上,它似乎已经打开每个提交数据的页面(大多数页面)。因此,它通常是1:1的页面,或者是表格的1:1。

有没有人遇到类似的问题?我们正在向IBM开出一张票,但也想问这个社区。提前谢谢!

3 个答案:

答案 0 :(得分:1)

可以是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表示不缓存。

答案 1 :(得分:1)

实际问题证明是Portal中的一项工作功能。具体来说,Portal的行动保护可以防止同一行动被提交两次,同时保持门户的导航能力。有一个缓存可以保留每个成功操作的操作结果,并使用它们来比较和拒绝重复操作。

我们面临的问题是,我们需要“比正常时间更长”的用户会话(60多分钟)以及1,000多名并发用户,我们在几个小时后就泄露了这种保护机制。

IBM建议我们使用以下portlet.xml配置条目完全关闭缓存:

wps.multiple.action.execution = true

这允许双重提交,这可能会或可能不会损害业务功能。但是,我们的内部Portal框架已经包含了一个防止双重提交的机制,所以这对我们来说不是问题。

根据我们的要求,IBM确实带回了针对此问题的补丁,这使得缓存可以自定义,也就是说,让您配置存储在缓存中的每个用户的操作结果数量,从而可以再次利用Portal的机制,减少了会话开销。这些门户配置设置为:

wps.multiple.action.cache.bound.enabled = true
wps.multiple.action.cache.key.maxsize = 40
wps.multiple.action.cache.value.maxsize = 10

您需要就此补丁与IBM联系,因为它当前不在已发布的修补程序包中。

答案 2 :(得分:0)

您的Websphere Portal Server是否安装了最新的修订包?

http://www-01.ibm.com/support/docview.wss?uid=swg24024380&rs=0&cs=utf-8&context=SSHRKX&dc=D420&loc=en_US&lang=en&cc=US

您也可能对以下讨论感兴趣

http://www.ibm.com/developerworks/forums/thread.jspa?messageID=14427700&tstart=0

更新

只是扔一些盲目的折叠飞镖。

  • “RES#”对我来说听起来像资源。
  • 从论坛堆栈跟踪, “DefaultActionResultManager.storeDocument” 表示它正在存储文件。

因此看起来您的资源(生成的门户页面)正在被缓存。检查是否有一些可以减少资源缓存大小的参数。

另外在另一个测试集缓存到期时间为5分钟而不是一小时。