网站首页 > 技术文章 正文
没有任何神奇的工具可以为您修复OutOfMemoryError,但是下面有一些选项可以帮助您自动排除故障并确定根本原因。按照以下三个步骤来处理此JVM内存错误并开始恢复:
- 捕获JVM堆转储
- 重启应用程序
- 诊断问题
一、捕获堆转储
堆转储是在指定时间点J内ava程序内存中的内容的快照。它包含有关存储器中存在的对象的详细信息,这些对象中存在的实际数据,这些对象如何维护到其他对象以及其他信息。堆转储是修复OutOfMemoryError的重要步骤,但它们确实存在一些挑战,因为它们的内容可能难以阅读和解密。
在最佳情况下,您希望在OutOfMemoryError之前或之前捕获堆转储以诊断原因,但这并不容易。但是,您可以自动执行此堆转储过程。通过使用以下变量编辑JRE的启动参数,告诉JVM创建堆转储:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/crashes/my-heap-dump.hprof
二、重新启动麻烦的应用程序
大多数情况下,OutOfMemoryError不会使应用程序崩溃,但它可能会使应用程序处于不稳定状态。在这种情况下重启将是一种谨慎的举动,因为不稳定的应用程序实例提供的请求会导致错误的结果。
您也可以自动执行此重启过程。只需编写一个“restart-myapp.sh”脚本,它会重启您的应用程序。向JVM提供命令行参数,以便在遇到异常时触发它以运行以下脚本:
-XX:OnOutOfMemoryError=/scripts/restart-myapp.sh
传递此参数时,只要抛出OutOfMemoryError,JVM就会调用“/scripts/restart-myapp.sh”脚本。因此,您的应用程序将在遇到OutOfMemoryError后立即自动重新启动。
三、诊断问题
现在您已经捕获了堆转储 - 这是解决问题所需的 - 并重新启动应用程序 - 以减少中断影响 - 下一步是故障排除。
如上所述,理解堆转储的内容可能很棘手,但有一些有用的堆分析器工具可以帮助简化流程。一些选项包括Eclipse Memory Analyzer(MAT),Oracle JHat或HeapHero。
这些工具生成内存分析报告,突出显示导致最大内存的对象,并希望帮助识别导致内存泄漏的对象。
当您的应用程序遇到运行时错误时,这会非常令人沮丧。您需要耐心,内存堆转储以及分析问题的适当工具来修复OutOfMemoryError以及类似类似的其他令人讨厌的异常。
写在最后
- 第一:看完点赞,感谢您的认可;
- ...
- 第二:随手转发,分享知识,让更多人学习到;
- ...
- 第三:记得点关注,每天更新的!!!
- ...
猜你喜欢
- 2024-10-12 SpringBoot执行jar报错java.lang.OutOfMemoryError_指定内存大小
- 2024-10-12 几种内存溢出(内存溢出类型)
- 2024-10-12 JVM优化:实战OutOfMemoryError异常
- 2024-10-12 JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式
- 2024-10-12 线上故障排查全套路,总有一款适合你
- 2024-10-12 面试被问到“零拷贝”!你真的理解吗?
- 2024-10-12 面试夺命三问之《内存溢出和逃逸分析》
- 2024-10-12 阿里面试官:Exception和Error有什么区别?
- 2024-10-12 Eclipse运行大量文件异常OutOfMemoryError: GC overhead limit
- 2024-10-12 记一次线上内存异常排查实战(线上内存泄漏如何定位)
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)