Java 堆内存溢出原因分析堆内存溢出原因分析
主要介绍了Java 堆内存溢出原因分析,任何使用过基于 Java 的企业级后端应用的软件开发者都会遇到过这种报
错,java.lang.OutOfMemoryError:Java heap space。,需要的朋友可以参考下
前言前言
任何使用过基于 Java 的企业级后端应用的软件开发者都会遇到过这种低劣、奇怪的报错,这些报错来自于用户或是测试工程
师: java.lang.OutOfMemoryError:Java heap space。
为了弄清楚问题,我们必须返回到算法复杂性的计算机科学基础,尤其是“空间”复杂性。如果我们回忆,每一个应用都有一个
最坏情况特征。具体来说,在存储维度方面,超过推荐的存储将会被分配到应用程序上,这是不可预测但尖锐的问题。这导致
了堆内存的过度使用,因此出现了"内存不够"的情况。
这种特定情况最糟糕的部分是应用程序不能修复,并且将崩溃。任何重启应用的尝试 - 甚至使用最大内存(-Xmx option)- 都
不是长久之计。如果不明白什么导致了堆使用的膨胀或突出,内存使用稳定性(即应用稳定性)就不能保障。于是,什么才是
更有效的理解关于内存的编程问题的途径?当内存溢出时,明白应用程序的内存堆和分布情况才能回答这个问题。
在这一前提下,我们将聚焦以下方面:
当内存溢出时,获取到 Java 进程中的堆转储。
明白应用程序正在遭遇的内存问题的类型。
使用一个堆分析器,可以使用 Eclipse MAT 这个优秀的开源项目来分析内存溢出的问题。
配置应用,为堆分析做准备配置应用,为堆分析做准备
任何像内存溢出这种非确定性的、时有时无的问题对于事后的分析都是一个挑战。所以,最好的处理内存溢出的方法是让
JVM 虚拟机转储一份 JVM 虚拟机内存状态的堆文件。
Sun HotSpot JVM 有一种方法可以引导 JVM 转储内存溢出时的堆状态到一个文件中。其标准格式为 .hprof 。所以,为了实现
这种操作,向 JVM 启动项中添加 XX:+HeapDumpOnOutOfMemoryError 。因为内存溢出可能经过很长一段时间才会发生,
向生产系统增加这一选项也是必须的。
如果堆转储 .hprof 文件必须被写在一个特定的文件系统位置,那么就添加目录途径到 XX:HeapDumpPath 。只需确保该应用
对于指定目录途径始终拥有写入权限。
原因分析原因分析
101:了解内存溢出错误的本质:了解内存溢出错误的本质
当尝试去评估和了解一个内存溢出错误时,最先做的事情应该是观察内存增长特征。根据情况做出可能性的评估:
尖峰状:这种类型的内存溢出在某种类型的加载上会是比较激烈的。当 JVM 分配内存给 20 个用户时,应用程序可以正
常运行。但是,如果到第 100 个用户时可能会遭遇到内存峰值,从而导致内存溢出。有两种可能的办法去解决这个问
题。
泄露:由于某些编程问题,内存使用随着时间的推移逐渐增加。
拥有良性垃圾回收机制的健康图表