战争servlet中的泄漏内存与tomcat

时间:2014-03-21 09:12:32

标签: java servlets memory-leaks tomcat6

当我尝试在我的工作servlet中实现一个新函数时,我遇到了一些问题。

现在我有一个手机可以注册的servlet。手机使用rest来注册这个servlet。它完美无缺。无论何时尝试注册手机,都可以。

但现在,我需要添加一项新功能。我想将此服务器注册到我的基础架构的其他组件。

我希望在开始时完成注册。我的意思是,当servlet启动时,进行注册并忘记它,就像以前那样工作。

这是tomcat给我的错误:

Grave: The web application [/servletRegister] appears to have started a thread named [Timer-8] but has failed to stop it. This is very likely to create a memory leak.

这是我的开始课程:

@Override
public Set<Class<?>> getClasses() {
    //-------------------------------
    //Set registration here
    //GatewayRegistrationHandler reg = GatewayRegistrationHandler.getInstance(); 
    //reg.registerDevice();
    //-------------------------------
    //register on a new thread due to process time      
    new Thread (new RegisterGatewayOnBackground()).start();

    //Next are the working servlet code
    Set<Class<?>> classes = new HashSet<Class<?>>();
    classes.add(PublicationsResource.class);  /
    classes.add(DeviceResource.class);
    return classes;
}

}

我首先尝试了注释行。然后我得到了内存泄漏,我试图在一个新的线程中执行它们,试图避免泄漏。但行为是一样的。

后台功能是:

public class RegisterGatewayOnBackground implements Runnable {
    public RegisterGatewayOnBackground() {
    }   
    public void run() {
        registerDevice();
    }
    private void registerDevice() {         
          GatewayRegistrationHandler reg = GatewayRegistrationHandler.getInstance(); 
          reg.registerDevice();   
    }
}

GatewayRegistrationHandler工作正常,因为当我运行servlet时,它会执行,进行注册,然后崩溃。我认为这是一个时间问题,背景会解决它但我被困在这里,因为背景也一样。

我不知道如何检查我的内存泄漏位置。我正在寻找建议或任何可以帮助我解决问题的工具。

1 个答案:

答案 0 :(得分:2)

当你开始这样的线程时,它不会被命名为“Timer-x”。因此,这可能是其他地方开始的一个主题。

tomcat给你的消息表明webapp以某种方式被取消部署(然后它检查仍然存在的线程,并且如果存在则进行抱怨)。我不确定为什么取消部署正在发生,但如果是因为你正在停止webapp,你可能不需要解决这个问题,除非你做(很多)热部署(在保持tomcat运行的同时部署和取消部署)。这是因为,如果它在你要杀死进程之前泄漏内存,那么内存泄漏不会有任何伤害,而且修复它会浪费时间。

如果你想修复它,一个简单的方法是挂钩一个分析器,看看谁启动了这个“定时器”线程。