1

我正在使用 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

4

0 回答 0