代码之家  ›  专栏  ›  技术社区  ›  Laird Nelson

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

  •  10
  • Laird Nelson  · 技术社区  · 16 年前

    我正在尝试让Tomcat在Windows2003框上作为服务运行,将堆转储到 OutOfMemoryError .

    (Tomcat正在运行Hudson,它在我构建的末尾报告了堆空间问题。手动运行生成不会产生这样的错误。哈德逊人需要一堆垃圾才能开始。)

    按照其他地方的指示,我已经告诉Apache服务监视器配置它用来运行Tomcat以在 内存不足错误 将以下内容添加到JVM选项时遇到: -xx:+堆转储自动故障存储器错误 然后我再次运行构建。果然,它报告有一个堆错误。我扫描整个磁盘寻找默认值 java_pid123.hprof 文件(显然 123 替换为JVM的PID)。不 .hprof 文件存在于任何地方。

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

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

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

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

    7 回复  |  直到 9 年前
        1
  •  5
  •   Laird Nelson    16 年前

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

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

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

    编辑 球拍 要包含的文件 -XX:+HeapDumpOnOutOfMemoryError 以及 -XX:HeapDumpPath=C:\whatever 选项位于正确的位置(您可以在其中放置JVM选项)。这应该能解决问题。

        2
  •  2
  •   Gennady Shumakher    16 年前
        3
  •  1
  •   Peter Schuetze    16 年前

    我找到了下面的链接,它描述了如何配置Tomcat服务(包括设置Java参数)。不确定它是否适用于正在运行的版本。

    http://tomcat.apache.org/tomcat-5.5-doc/windows-service-howto.html

        4
  •  0
  •   skaffman    16 年前

    这个 .hprof 文件被转储到当前目录中。这对Windows服务的确切意义是任何人都可以猜测的,假设它意味着什么。

    我建议发布一个新问题 http://superuser.com )询问“当前目录”对于Windows服务意味着什么。

        5
  •  0
  •   stacker    16 年前

    From 20 Tips for Using Tomcat in Production

    在catalina.sh(或catalina.bat for windows)中为Java选项添加以下内容:- XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/j2ee/heapdumps

        6
  •  0
  •   Adeel Ahmad    12 年前

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

        7
  •  0
  •   Anil Agrawal    9 年前

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

    1. 以管理员身份运行命令控制台
    2. JDK版本(对于JMAP命令)和JRE(Java app运行环境)应该是相同的。
    3. 从任务管理器获得Java应用程序运行窗口进程的PID NO
    4. 执行以下命令

    jmap-dump:file=d:\heapdump\myheapdump.hprof-f pid_否#

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