OutOfMemoryError:Java堆空间–分析和解决方法

java.lang.OutOfMemoryError:Java堆问题是在支持或开发复杂的Java EE应用程序时可能会遇到的最复杂的问题之一。
这篇简短的文章将为您提供此JVM HotSpot OutOfMemoryError错误消息的描述,以及在解决该问题之前应如何解决此问题。
有关如何确定要处理的OutOfMemoryError类型的快速帮助指南,请查阅此Blog中的相关文章。 您还将找到有关如何分析JVM堆转储和识别潜在内存泄漏的教程。
java.lang.OutOfMemoryError:Java堆空间–这是什么?
此错误消息通常是在JVM OutOfMemoryError条件后您将看到的中间件服务器日志(Weblogic,WAS,JBoss等)的内容:
·它是从实际的Java HotSpot VM本机代码生成的
·由于Java Heap(年轻一代/旧一代空间)内存分配失败( 由于Java Heap耗尽触发
在OpenJDK项目源代码的下面找到暴露JVM HotSpot实现的代码片段。 该代码显示了哪个条件触发了OutOfMemoryError:Java堆空间条件。
#collectedHeap.inline.hpp
我强烈建议您自己从OpenJDK下载HotSpot VM源代码,以自己的利益和将来的参考。
好的,我的应用程序Java Heap已经用尽了……我如何监视和跟踪我的应用程序Java Heap?
正确监视和跟踪Java堆空间(年轻一代和老一代空间)的内存占用量的最简单方法是从HotSpot VM中启用详细GC。 请简单地在JVM启动参数中添加以下参数:
-verbose:gc –XX:+ PrintGCDetails –XX:+ PrintGCTimeStamps –Xloggc:<应用程序路径> /gc.log
然后,您可以按照下面的教程进行操作,以了解如何阅读和分析HotSpot Java Heap占用空间。
好的,谢谢,现在我可以看到我有一个很大的Java Heap内存问题…但是如何解决呢?
有多种情况可能导致Java堆耗尽,例如:
·Java堆空间相对于您的应用程序流量和占用空间太小
·Java堆内存泄漏( OldGen空间随着时间的推移而缓慢增长……
·突发线程和/或流氓线程在短时间内等占用大量内存。
在下面找到您可以遵循的高级步骤列表,以进行进一步的故障排除:
·如果尚未完成,请启用详细GC >> -verbose:gc
·分析详细的GC输出并确定每个Java Heap空间(YoungGen和OldGen)的Java Heap的内存占用量
·分析详细的GC输出或使用JConsole之类的工具来确定您的Java Heap是否随时间泄漏。 这可以通过监视HotSpot旧发电机空间来观察。
·监视您的中间件线程并定期生成JVM线程转储,尤其是当观察到Java Heap利用率突然增加时。 线程转储分析将使您能够查明潜在的长时间运行的线程,这些线程可以在很短的时间内在Java堆上分配大量对象。 如果有的话
·在JVM启动参数中添加以下参数:-XX:HeapDumpOnOutOfMemoryError这将使HotSpot VM生成二进制的堆转储(HPROF)格式。 二进制堆转储是关键数据,可用来分析应用程序的内存占用和/或Java堆内存泄漏的源
从分辨率的角度来看,我建议您使用生成的堆转储分析Java堆内存占用量。 可以使用免费的内存分析器工具(MAT)分析二进制堆转储(HPROF格式)。 这将使您了解您的Java应用程序占用空间和/或查明可能的内存泄漏的来源。 一旦清楚了解了这种情况,就可以通过增加Java堆容量(通过–Xms和Xmx参数)或减少应用程序内存占用和/或消除应用程序代码中的内存泄漏来解决问题。 请注意,在中间件服务器代码和JDK中也经常发现内存泄漏。
我已尽一切努力,但我仍在努力查明OutOfMemoryError的来源
不用担心,只需在本文末尾发表评论/问题或直接通过电子邮件发送给我@ phcharbonneau @ hotmail.com 。 我目前提供免费的IT / Java EE咨询。 请在提供您生成的数据(例如指向堆转储的下载链接,线程转储数据,服务器日志等)的同时为您提供问题描述,我们将为您分析问题。

翻译自: https://www.javacodegeeks.com/2012/05/outofmemoryerror-java-heap-space.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值