当我试图在我的工作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时,它会执行、进行注册,然后崩溃。我认为这是一个时间问题,背景可以解决它,但我被困在这里,因为背景也是这样。
我不知道怎样才能找到我的记忆泄漏。我正在寻求建议或任何可能帮助我解决问题的工具。
发布于 2014-03-21 09:38:27
当您像这样启动线程时,它将不会被命名为"Timer-x“。因此,这可能是从其他地方开始的一条线索。
tomcat给您的消息表明webapp应用程序正以某种方式被取消部署(然后它检查仍然存在的线程,并抱怨是否存在)。我不知道为什么会发生未部署,但如果是因为您停止了why应用程序,您可能不需要修复这个问题,除非您做了(大量)热部署(部署和取消部署,同时保持tomcat运行)。这是因为,如果它在您要终止进程之前泄漏内存,那么内存泄漏不会有任何危害,修复它将是浪费时间。
如果您想要修复它,一个简单的方法是钩住一个分析器,看看是谁启动了这个“计时器”线程。
https://stackoverflow.com/questions/22554489
复制相似问题