如何在不新增业务无关程序的前提下主动触发Java应用的OutOfMemoryError?
无需额外程序触发OutOfMemoryError的方案
针对Tomcat Web应用
利用JDK自带的jcmd工具(无需添加任何应用内代码或额外程序),步骤如下:
- 获取Web应用的JVM进程ID:
jps | grep Bootstrap # Tomcat的主进程通常为Bootstrap - 执行内置脚本触发内存耗尽:
这段脚本会在目标JVM中持续创建1MB字节数组并持有引用,直到触发jcmd <你的Tomcat进程PID> VM.run_script -language javascript -script <(echo "var leakList = new java.util.ArrayList(); while(true) { leakList.add(new byte[1024*1024]); }")OutOfMemoryError。
针对RHEL上的批处理应用
同样使用JDK自带工具操作:
- 获取批处理应用的JVM进程ID:
jps | grep <你的批处理主类名> # 或用ps命令:ps aux | grep java | grep <应用标识> - 执行内存耗尽脚本:
jcmd <批处理进程PID> VM.run_script -language javascript -script <(echo "var leakList = new java.util.ArrayList(); while(true) { leakList.add(new byte[1024*1024]); }")
关键说明
- 所有工具(
jcmd、jps)均为JDK自带组件,不属于“与业务无关的额外程序”,符合项目规则。 - 无需修改任何JVM参数(如
-Xmx/-Xms),完全基于应用原有配置触发OOM,满足测试要求。 - 触发后可检查指定路径下的
.hprof文件是否生成,验证命令行选项的有效性。
内容的提问来源于stack exchange,提问作者SATO Yusuke
相关产品推荐
相关产品推荐

