嵌入式Tomcat 7触发OOM时无法自动生成Heap Dump求助
解决嵌入式Tomcat 7 OOM自动生成Heap Dump的问题
针对你在STS中配置嵌入式Tomcat 7时,OOM自动生成Heap Dump失败的情况,我整理了以下可行方案:
一、核心JVM参数确认
首先确保你配置了正确的JVM参数,这是自动生成Heap Dump的关键:
-XX:+HeapDumpOnOutOfMemoryError:触发OutOfMemoryError时自动生成Heap Dump文件-XX:HeapDumpPath=<绝对路径>:指定Dump文件的保存路径(必须保证Tomcat进程对该路径有读写权限)
示例完整参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\dev\heapdumps\tomcat_oom.hprof
二、STS中配置VM参数的正确步骤
如果你的嵌入式Tomcat是通过STS的「Java Application」启动(比如Spring项目嵌入Tomcat):
- 右键你的项目 → 「Run As」→ 「Run Configurations...」
- 在左侧列表找到对应的「Java Application」启动项
- 切换到「Arguments」标签页
- 在「VM arguments」输入框中添加上述JVM参数,点击「Apply」再启动项目
如果是通过Maven的tomcat7-maven-plugin启动嵌入式Tomcat:
需要在项目的pom.xml中配置插件的JVM参数:
<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!-- 添加OOM自动Dump参数 --> <jvmArguments>-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\dev\heapdumps\tomcat_maven_oom.hprof</jvmArguments> <!-- 其他Tomcat配置 --> <port>8080</port> </configuration> </plugin> </plugins> </build>
三、验证配置是否生效
可以写一段简单的测试代码手动触发OOM,验证Dump文件是否生成:
import java.util.ArrayList; import java.util.List; public class OOMTest { public static void main(String[] args) { List<byte[]> memoryHog = new ArrayList<>(); // 不断分配内存直到触发OOM while (true) { memoryHog.add(new byte[1024 * 1024]); // 每次分配1MB内存 } } }
运行这段代码后,检查你指定的HeapDumpPath路径下是否生成了.hprof文件。
四、常见问题排查
- 路径问题:不要用相对路径,否则Dump文件可能生成在STS的工作目录(比如项目根目录或STS安装目录),建议用绝对路径
- 权限问题:确保指定的路径有读写权限(比如避免写入
C:\Windows这类系统目录),可以选择用户目录或临时目录 - 参数拼写错误:JVM参数大小写敏感,检查是否把
HeapDumpOnOutOfMemoryError拼错(比如少写字母r) - 启动方式不匹配:如果用Maven插件启动,必须在插件配置里加参数,VM参数配置不会生效
内容的提问来源于stack exchange,提问作者AR1
相关产品推荐
相关产品推荐

