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

Java 我可以让Tomcat作为服务运行以转储堆吗?,java,tomcat,hudson,heap,tomcat6,Java,Tomcat,Hudson,Heap,Tomcat6,我正试图让Tomcat在OutOfMemoryError上转储堆,Tomcat目前作为Windows 2003机箱上的服务运行 (Tomcat正在运行Hudson,它在我构建的末尾报告了一个堆空间问题。手动运行构建不会产生这样的错误。Hudson需要一个堆转储来开始。) 正如其他地方所指示的,我已经告诉Apache服务监视器配置JVM,当遇到OutOfMemoryError时,通过向JVM选项添加以下内容,它将使用JVM运行Tomcat以转储堆: -XX:+HEAPDUMPONAUTOFMEMO

我正试图让Tomcat在
OutOfMemoryError
上转储堆,Tomcat目前作为Windows 2003机箱上的服务运行

(Tomcat正在运行Hudson,它在我构建的末尾报告了一个堆空间问题。手动运行构建不会产生这样的错误。Hudson需要一个堆转储来开始。)

正如其他地方所指示的,我已经告诉Apache服务监视器配置JVM,当遇到
OutOfMemoryError
时,通过向JVM选项添加以下内容,它将使用JVM运行Tomcat以转储堆: -XX:+HEAPDUMPONAUTOFMEMORYERROR 然后我再次运行构建。果然,它报告了一个堆错误。我扫描整个磁盘,寻找默认的
java_pid123.hprof
文件(显然
123
被JVM的PID替换)。任何地方都不存在
.hprof
文件

我陷入了第22条陷阱:我需要堆转储来帮助哈德逊兄弟修复他们的内存泄漏,但如果我在Tomcat下运行哈德逊,我就无法获得堆转储

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

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


肯定有其他人也有类似的问题?

.hprof
文件转储到当前目录中。假设这意味着什么,那么这对windows服务到底意味着什么是任何人的猜测


我建议在上发布一个新问题,询问“当前目录”对windows服务意味着什么。

您是否尝试过-XX:HeapDumpPath选项


在catalina.sh(或用于Windows的catalina.bat)中的JAVA选项中添加以下内容:-
XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/home/j2ee/heapdumps
我找到了以下链接,该链接描述了如何配置tomcat服务(包括设置JAVA参数)。不确定它是否适用于您正在运行的版本


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

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

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


编辑
service.bat
文件,将
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=C:\where
选项包含在正确的位置(您可以将JVM选项放在这里)。这应该可以解决问题。

如果您已使用.exe安装tomcat,则可以将tomcat服务配置为使用本地系统帐户以外的帐户,并且可以在创建转储文件的目录“c:\where”上分配该用户权限。这里要记住的一件事是,tomcat服务不能使用具有管理权限的帐户运行。因此,在windows中创建一个简单用户(用户组的成员),并将tomcat服务设置为该用户帐户。并授予该用户在“c:\whatever”目录上的权限。这解决了用户目录权限问题,但您必须为内存转储错误配置tomcat。

当java进程作为窗口服务运行时,您可以使用以下步骤生成heapdump

  • 以管理员身份运行命令控制台
  • JDK(用于jmap命令)和JRE(Java应用程序运行环境)的版本应该相同
  • 从任务管理器获取该java应用程序运行窗口进程的PID编号
  • 执行下面的命令
  • jmap-dump:file=d:\heapdump\myHeapDump.hprof-F#PID_No#

    如果JDK/JRE 7出现任何异常,请尝试使用JDK/JRE 8
    实际上,我在jmap中遇到了jdk7的一些问题,但是当我转到jdk8时,我能够使用相同的命令成功地生成堆转储

    我应该提到,我已使用jconsole连接到Tomcat,并观察到堆使用量从未超过60MB。当然,问题是服务监视器没有调用任何脚本。可能是当前目录,但计算机上根本不存在.hprof文件。因此,windows服务可能没有“当前目录”,windows正在将该文件转储到空目录中。我关于进一步了解windows服务的建议仍然有效。服务监视器声称当前目录为C:\Program Files\Apache Tomcat\Tomcat 6.0。我已经编写了一个servlet,它将一个文件输出到当前目录,并且该文件显示在该目录中;这确实很有帮助,但我应该提到我正在运行Tomcat6。