我正在尝试将Tomcat(当前作为Windows 2003框上的服务运行)转储到上OutOfMemoryError。
OutOfMemoryError
(Tomcat正在运行Hudson,它在我的构建的末尾报告了堆空间问题。手动运行构建不会产生此类错误。Hudson的家伙需要堆转储才能开始。)
按照其他地方的说明,我已经OutOfMemoryError通过将以下内容添加到JVM选项中来告诉Apache Service Monitor配置用于运行Tomcat来转储堆的JVM:-XX:+ HeapDumpOnOutOfMemoryError然后我再次运行构建。果然,它报告有堆错误。我扫描整个磁盘以查找默认java_pid123.hprof文件(显然123已被JVM的PID取代了)。没有.hprof文件存在任何地方。
java_pid123.hprof
123
.hprof
我被困在陷阱22中:我需要Hudson家伙使用堆转储来解决他们的内存泄漏,但是如果我在Tomcat下运行Hudson,则无法获得堆转储。
当Tomcat作为Windows服务运行时,是否有一些特殊的方法可以在OutOfMemoryError上从中获取堆转储?
我尝试过的另一件事是在“启动”和“关闭”选项卡上告诉它使用“ Java”选项而不是“ jvm”选项。我相信这应该告诉服务管理器尝试使用Java可执行命令启动Tomcat,而不是jvm.dll直接启动Tomcat 。当我这样做时,该服务将无法启动。
jvm.dll
当然其他人也有类似的问题吗?
终于把这个放在床上之后,我想为其他可能遇到相同问题的人回答这个问题。
首先,如果在Windows上安装Tomcat .exe,则即使Apache升级了安装程序,也不要使用该安装程序。无论您做什么,它都不允许您以系统帐户以外的任何其他方式运行Tomcat。似乎该系统帐户没有权限.hprof在当前目录中写入文件,并且似乎没有进行任何Windows安全性调整都可以使此问题消失。
.exe
好的,因此您已经从.zip发行版中安装了Tomcat 。使用service.bat脚本将其作为服务安装。确保将其设置为以为此目的专门创建的特定用户身份运行。同样,请确保您希望Tomcat在堆转储时写入的文件夹是该用户可写的。
.zip
service.bat
编辑service.bat文件以将-XX:+HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath=C:\whatever选项包含在正确的位置(您可以在其中放置JVM选项)。这应该够了吧。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=C:\whatever