中软国际:Java堆内存溢出的本质是什么

了解内存溢出错误的本质

事实证明,无论是什么情况,只要了解它的基本情况比如基本概念,解决起来相对得心应手些。如何去评估和了解一个内存溢出错误?最先做的事情应该是观察内存增长特征。根据情况做出可能性的评估:

尖峰状:这种类型的内存溢出在某种类型的加载上会是比较激烈的。当JVM分配内存给 20 个用户时,应用程序可以正常运行。但是,如果到第 100 个用户时可能会遭遇到内存峰值,从而导致内存溢出。有两种可能的办法去解决这个问题。

泄露:由于某些编程问题,内存使用随着时间的推移逐渐增加。

内存溢出如何解决呢

修复引起内存溢出的代码:由于应用在某段时间内增量添加了一个对象而没有清除其引用(来自正在运行的应用程序的对象引用),导致不得不修复程序错误。

增加内存最大值作为一种修复方法。在懂得了运行内存特征和堆之后,可能必须增加分配的最大堆内存来避免再次发生内存溢出,因为推荐的最大内存值不能满足应用程序的稳定性。所以,应用程序基于堆分析器的评估,将Java -Xmx的 flag 信息更新成一个更高值后再来运行。

堆分析

下面分析如何使用一个堆分析工具来分析堆转储。

使用MAT进行堆分析

通过一系列的步骤,帮助探索在MAT中的不同表现和视图,以获取一个堆内存溢出的示例并思考分析。

1.打开内存溢出错误发生时产生的 .hprof 堆文件。确保复制转储文件到一个专门的文件夹下,因为 MAT 会创建许多索引文件:文件 -> 打开

2.打开转储文件,有内存泄漏嫌疑报告和组件报告的选项。选择运行泄漏嫌疑报告。

3.泄漏嫌疑表打开后,在预览窗口的饼状图会展示在每个对象基础上保留内存的分布情况。它显示了内存中的最大对象(拥有最高保留内存的对象 —— 累积的内存和引用的对象)。

4.上面的饼图通过聚合拥有最高内存引用(本身内存和总内存)的对象来展示 3 个问题嫌疑。

检查代码

代码检查需要查看是不是由socket套接字被关闭导致的。在这种情况下,它显示与 I/O 相关的所有流,需要被正确地关闭。在一点上,我们怀疑 JVM 是始作俑者。实际上,在 Open JDK 6.0.XX 的 GC(垃圾收集器)上的代码中有一个 BUG。

Java堆内存溢出的本质这篇写的还是不够完全的,关注广州中软国际官网www.gzetc.com.cn获取更多干货。

你可能感兴趣的:(中软国际:Java堆内存溢出的本质是什么)