一尘不染

我可以让Tomcat作为服务运行以转储堆吗?

tomcat

我正在尝试将Tomcat(当前作为Windows 2003框上的服务运行)转储到上OutOfMemoryError

(Tomcat正在运行Hudson,它在我的构建的末尾报告了堆空间问题。手动运行构建不会产生此类错误。Hudson的家伙需要堆转储才能开始。)

按照其他地方的说明,我已经OutOfMemoryError通过将以下内容添加到JVM选项中来告诉Apache Service
Monitor配置用于运行Tomcat来转储堆的JVM:-XX:+
HeapDumpOnOutOfMemoryError然后我再次运行构建。果然,它报告有堆错误。我扫描整个磁盘以查找默认java_pid123.hprof文件(显然123已被JVM的PID取代了)。没有.hprof文件存在任何地方。

我被困在陷阱22中:我需要Hudson家伙使用堆转储来解决他们的内存泄漏,但是如果我在Tomcat下运行Hudson,则无法获得堆转储。

当Tomcat作为Windows服务运行时,是否有一些特殊的方法可以在OutOfMemoryError上从中获取堆转储?

我尝试过的另一件事是在“启动”和“关闭”选项卡上告诉它使用“ Java”选项而不是“
jvm”选项。我相信这应该告诉服务管理器尝试使用Java可执行命令启动Tomcat,而不是jvm.dll直接启动Tomcat
。当我这样做时,该服务将无法启动。

当然其他人也有类似的问题吗?


阅读 180

收藏
2020-06-16

共1个答案

一尘不染

终于把这个放在床上之后,我想为其他可能遇到相同问题的人回答这个问题。

首先,如果在Windows上安装Tomcat
.exe,则即使Apache升级了安装程序,也不要使用该安装程序。无论您做什么,它都不允许您以系统帐户以外的任何其他方式运行Tomcat。似乎该系统帐户没有权限.hprof在当前目录中写入文件,并且似乎没有进行任何Windows安全性调整都可以使此问题消失。

好的,因此您已经从.zip发行版中安装了Tomcat
。使用service.bat脚本将其作为服务安装。确保将其设置为以为此目的专门创建的特定用户身份运行。同样,请确保您希望Tomcat在堆转储时写入的文件夹是该用户可写的。

编辑service.bat文件以将-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=C:\whatever选项包含在正确的位置(您可以在其中放置JVM选项)。这应该够了吧。

2020-06-16