【发布时间】:2014-03-21 09:12:31
【问题描述】:
当我尝试在我的工作 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 时,它会执行、进行注册,然后崩溃。我认为这是一个时间问题,背景会解决它,但我被困在这里,因为背景也是如此。
我不知道有什么方法可以检查哪里可以找到我的内存泄漏。我正在寻找可以帮助我解决问题的建议或任何工具。
【问题讨论】:
-
这是java代码,什么内存泄漏?垃圾收集器确保没有内存泄漏。为什么说可能是这样?
-
因为 tomcat 日志:catalina.2014... 说这个 servlet 由于内存泄漏而关闭。我也认为垃圾收集器应该删除所有未使用但...
-
@Pandrei:GC 无法确保没有内存泄漏。它只会有帮助。
-
您能否从您的日志文件中粘贴相关行。另外,是tomcat自行关闭还是在您尝试关闭tomcat时显示此消息?
-
@Biribu 这根本不是错误所说的。它说可能存在内存泄漏,因为(计时器)线程已启动,但在请求完成时并未停止。我也没有看到任何证据表明它实际上是一个错误,它似乎只是一个警告消息。
标签: java servlets memory-leaks tomcat6