如何解决JVM OutOfMemoryError内存泄漏问题?

没有任何神奇的工具能够为您修复OutOfMemoryError,可是下面有一些选项能够帮助您自动排除故障并肯定根本缘由。按照如下三个步骤来处理此JVM内存错误并开始恢复:sql

  1. 捕获JVM堆转储
  2. 重启应用程序
  3. 诊断问题

1、捕获堆转储

堆转储是在指定时间点J内ava程序内存中的内容的快照。它包含有关存储器中存在的对象的详细信息,这些对象中存在的实际数据,这些对象如何维护到其余对象以及其余信息。堆转储是修复OutOfMemoryError的重要步骤,但它们确实存在一些挑战,由于它们的内容可能难以阅读和解密。架构

在最佳状况下,您但愿在OutOfMemoryError以前或以前捕获堆转储以诊断缘由,但这并不容易。可是,您能够自动执行此堆转储过程。经过使用如下变量编辑JRE的启动参数,告诉JVM建立堆转储:并发

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/crashes/my-heap-dump.hprof

2、从新启动麻烦的应用程序

大多数状况下,OutOfMemoryError不会使应用程序崩溃,但它可能会使应用程序处于不稳定状态。在这种状况下重启将是一种谨慎的举动,由于不稳定的应用程序实例提供的请求会致使错误的结果。app

您也能够自动执行此重启过程。只需编写一个“restart-myapp.sh”脚本,它会重启您的应用程序。向JVM提供命令行参数,以便在遇到异常时触发它以运行如下脚本:分布式

-XX:OnOutOfMemoryError=/scripts/restart-myapp.sh

传递此参数时,只要抛出OutOfMemoryError,JVM就会调用“/scripts/restart-myapp.sh”脚本。所以,您的应用程序将在遇到OutOfMemoryError后当即自动从新启动。高并发

3、诊断问题

如今您已经捕获了堆转储 - 这是解决问题所需的 - 并从新启动应用程序 - 以减小中断影响 - 下一步是故障排除。工具

如上所述,理解堆转储的内容可能很棘手,但有一些有用的堆分析器工具能够帮助简化流程。一些选项包括Eclipse Memory Analyzer(MAT),Oracle JHat或HeapHero。性能

这些工具生成内存分析报告,突出显示致使最大内存的对象,并但愿帮助识别致使内存泄漏的对象。学习

当您的应用程序遇到运行时错误时,这会很是使人沮丧。您须要耐心,内存堆转储以及分析问题的适当工具来修复OutOfMemoryError以及相似相似的其余使人讨厌的异常。spa

写在最后

最后,欢迎作Java的工程师朋友们加入Java高级架构进阶Qqun:963944895

群内有技术大咖指点难题,还提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

比你优秀的对手在学习,你的仇人在磨刀,你的闺蜜在减肥,隔壁老王在练腰, 咱们必须不断学习,不然咱们将被学习者超越!

趁年轻,使劲拼,给将来的本身一个交代!

相关文章
相关标签/搜索