10

我试图让 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,而不是jvm.dll直接启动。当我这样做时,服务将无法启动。

肯定有人遇到过类似的问题吗?

4

7 回答 7

6

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

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

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

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

于 2010-02-10T17:07:20.357 回答
2

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

http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

于 2010-01-31T16:10:45.760 回答
1

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

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

于 2010-02-01T14:49:25.593 回答
1

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

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

jmap -dump:file=d:\heapdump\myHeapDump.hprof -F #PID_No#

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

于 2016-12-21T07:23:46.733 回答
0

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

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

于 2010-01-31T15:44:57.860 回答
0

来自在生产环境中使用 Tomcat 的 20 个技巧

将以下内容添加到 catalina.sh(或 Windows 的 catalina.bat)中的 JAVA_OPTS:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/j2ee/heapdumps

于 2010-01-31T17:16:17.077 回答
0

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

于 2013-03-15T06:38:57.353 回答