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

Lai*_*son 10 java heap tomcat hudson tomcat6

我正在尝试使用Tomcat,它目前作为服务在Windows 2003机器上运行,转储堆上OutOfMemoryError.

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

正如其他地方所指示的那样,我已经告诉Apache Service Monitor配置JVM,它OutOfMemoryError通过在JVM选项中添加以下内容来运行Tomcat来转储堆:-XX:+ HeapDumpOnOutOfMemoryError然后我再次运行构建.果然,它报告存在堆错误.我扫描整个磁盘,寻找默认java_pid123.hprof文件(显然123由JVM的PID代替).任何.hprof地方都没有文件.

我遇到了陷阱22:我需要哈德森人员的堆转储来修复他们的内存泄漏,但如果我在Tomcat下运行Hudson,我就无法获得堆转储.

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

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

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

Lai*_*son 6

在最后把这个放到床上之后,我想对可能有同样问题的其他人回答这个问题.

首先,如果您在Windows上安装Tomcat,请不要使用.exe安装程序,即使它是由Apache提升的.无论你做什么,它都不会让你将Tomcat作为系统帐户以外的任何东西运行.系统帐户似乎没有.hprof在当前目录中写入文件的权限,并且没有任何Windows安全性调整可能会使此问题消失.

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

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