我正在尝试让 Tomcat(当前在 Windows 2003 机器上作为服务运行)将堆转储到OutOfMemoryError
.
(Tomcat 正在运行 Hudson,它在构建的尾部报告了堆空间问题。手动运行构建不会产生此类错误。Hudson 人员需要堆转储才能开始。)
正如其他地方所指示的,我已告诉 Apache Service Monitor 配置用于运行 Tomcat 的 JVM,以在出现异常时转储堆。OutOfMemoryError
通过将以下内容添加到 JVM 选项来遇到这种情况:
-XX:+HeapDumpOnOutOfMemoryError
然后我再次运行构建。果然,它报告存在堆错误。我扫描整个磁盘寻找默认值java_pid123.hprof
文件(显然123
被 JVM 的 PID 取代)。不.hprof
文件存在于任何地方。
我陷入了第 22 条陷阱:我需要 Hudson 人员的堆转储来修复他们的内存泄漏,但如果我在 Tomcat 下运行 Hudson,我无法获得堆转储。
当 Tomcat 作为 Windows 服务运行时,是否有某种特殊的方法可以在发生 OutOfMemoryError 时从中获取堆转储?
我尝试过的另一件事是告诉它在“启动”和“关闭”选项卡上使用“Java”选项而不是“jvm”选项。我相信这应该告诉服务管理器尝试使用 Java 可执行命令启动 Tomcat,而不是启动 Tomcatjvm.dll
直接地。当我这样做时,服务将不会启动。
当然其他人也遇到过类似的问题吗?
终于把这个问题放在床上后,我想为其他可能有同样问题的人回答这个问题。
首先,如果您在 Windows 上安装 Tomcat,请勿使用.exe
安装程序,尽管它是由 Apache 推广的。无论您做什么,它都不允许您以系统帐户以外的任何身份运行 Tomcat。看来系统帐户没有写入权限.hprof
文件位于当前目录中,并且无论进行多少 Windows 安全调整似乎都无法解决此问题。
好的,现在您已经安装了 Tomcat.zip
分配。使用以下命令将其安装为服务service.bat
脚本。确保将其设置为以您专门为此目的创建的特定用户身份运行。还要确保您希望 Tomcat 在发生堆转储时写入的文件夹可由该用户写入。
编辑service.bat
文件以包含-XX:+HeapDumpOnOutOfMemoryError
和-XX:HeapDumpPath=C:\whatever
将选项放在正确的位置(可以放置 JVM 选项的位置)。这应该够了吧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)