我将Tomcat作为Windows服务安装,有时当我尝试将其关闭时(通过services.msc),它会挂起。我尝试使用调试器附加它,但我似乎无法理解为什么它会挂起。
当我尝试通过执行“Thread.getThreads()[0]”查看其中一个线程时,我从调试器收到错误:“堆栈帧不可用”。
如果不是关闭整个Tomcat,我只是卸载所有servlet的上下文,一切都很完美。
您将如何进行调试?这个by-definition是Tomcat中的一个错误吗?
答案 0 :(得分:1)
我不认为这是tomcat中的一个错误,因为我的tomcats关闭了。
如果你说当你卸载所有网络应用程序时一切正常,可能问题出在其中一个网络应用程序上。尝试一次只卸载一个。关闭tomcat,看看会发生什么。如果它是导致问题的Web应用程序,一旦卸载它就不会有问题。
还有一个问题 - 当您从命令行(而不是从服务屏幕)执行此操作时会发生什么?
修改强>
要远程调试,您需要将以下内容添加到JAVA_OPTS
JAVA_OPTS=%JAVA_OPTS% -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n
然后你可以将像eclipse这样的IDE附加到进程(寻找远程调试)。您可以从here下载源代码。您正在寻找的(我猜)是实施Lifecycle.stop()的方法或LifecycleListener的实现。对不起,我不能更具体。
修改2
还有一件事 - 如果它是你的开发机器,我发现最好不要将eclipse作为服务运行,而是从命令行或直接从IDE运行
答案 1 :(得分:1)
为了完整起见,我必须问:你检查过Tomcat自己的日志文件吗?
%TomcatHome%\logs
这可能就像......
C:\Program Files\Apache Software Foundation\Tomcat 6.0\logs
请原谅我,如果这是你尝试的第一件事,但是你没有提到它,所以我想我要问一下。
答案 2 :(得分:0)
您可以尝试做的一件事是使用分析器来查看关闭后内存中剩下的对象。
我遇到了类似的问题,我的代码库出现了'逻辑内存泄漏'。需要仔细选择wordage,因为java垃圾收集确实可以防止大多数内存泄漏。逻辑内存泄漏是由程序员创建的,他们并不像应该的那样小心,或者处于过多的时间紧缩状态。
无论如何,我们使用JProfile来查看虚拟机中哪些对象仍然存在,并且我们发现在关闭期间某些线程没有得到妥善处理。如果你能够找到哪些对象仍然存在,你将会有一个暗示为什么tomcat没有完全关闭。