当我尝试在工作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时,它执行,进行注册,然后,在那之后,崩溃。我以为这是一个时间问题,背景会解决它,但我被困在这里,因为背景做同样的。
我不知道任何方法来检查在哪里找到我的内存泄漏。我正在寻找建议或任何工具,可能有助于我解决这个问题。
当你这样开始你的线程时,它不会被命名为"Timer-x"。因此,这可能是在其他地方启动的线程。
tomcat给你的消息表明web应用程序以某种方式被取消部署(然后它检查仍然存在的线程,如果有,就会发出警告)。我不确定为什么撤消正在发生,但如果这是因为你正在停止web应用程序。,您可能不需要修复这个问题,除非您进行(大量)热部署(在保持tomcat运行的情况下进行部署和取消部署)。这是因为,如果它在你打算终止进程之前泄漏内存,内存泄漏不会有任何危害,修复它只是浪费时间。
如果你想修复它,一个简单的方法是挂钩一个分析器,看看谁启动了这个"定时器"线程。