我正在使用 Jobss 4.2.3 GA 版本和 JRE 1.6。我正在使用 HttpSessionListener 来处理 sessionDestroyed() 通知。在这个方法中,我调用了一个 SFSB 的 @Remove 方法(它又调用了另一个它有引用的 SFSB 的 @Remove 方法)。SFSB bean 中有数据(使用 HashMap 存储)。我在@Remove 方法中清除了这张地图。在许多会话之后,我注意到我们遇到了 OOM 错误,我使用 VisualVM 监控了应用程序,发现在会话注销后应该清理的 SFSB 实际上在大多数情况下仍然保留在内存中。我强制进行了完整的 GC,但它们仍然存在。知道这种行为的原因是什么吗?
以下是我正在使用的代码片段(更改了类名以在片段中更有意义) -
public class MTAppSessionListener implements HttpSessionListener
{
public void sessionCreated( HttpSessionEvent event )
{
}
public void sessionDestroyed( HttpSessionEvent event )
{
HttpSession httpSession = event.getSession();
ServiceLocator locator = (ServiceLocator) httpSession.getAttribute("ServiceLocator");
if(locator != null){
locator.removeService();
}
}
}
@Stateful
@LocalBinding(jndiBinding = "ServiceLocator/local")
@RemoteBinding(jndiBinding = "ServiceLocator/remote")
@SerializedConcurrentAccess
public class ServiceLocatorStatefulBean implements ServiceLocator, ServiceLocatorLocal, ServiceLocatorRemote
{
MTService service; // holds ref to another Stateful session bean.
...
@Remove
private void removeService() {
if (service != null) {
service.remove(); // invoke its @Remove method
}
}
}
@Stateful
@LocalBinding(jndiBinding = "MTService/local")
@RemoteBinding(jndiBinding = "MTService/remote")
@SerializedConcurrentAccess
public class MTServiceStatefulBean implements MTService, MTServiceLocal, MTServiceRemote
{
HashMap dataMap;
@Remove
private void remove() {
if (dataMap != null) {
dataMap.clear();
}
}
}
web.xml(部分) -
<web-app>
<listener>
<listener-class>com.myorg.mt.webapp.common.MTAppSessionListener</listener-class>
</listener>
</web-app>
提前非常感谢。
问候, yvp