专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
稀土掘金技术社区  ·  掘金 AI 编程社区- 人人都是 AI 编程家竞赛 ·  3 天前  
程序员小灰  ·  39岁的小灰,再也回不去童年了! ·  2 天前  
51好读  ›  专栏  ›  程序员大咖

Java 堆内存溢出梗概分析

程序员大咖  · 公众号  · 程序员  · 2018-04-25 10:24

正文

请到「今天看啥」查看全文


  • 使用一个堆分析器,可以使用 Eclipse MAT 这个优秀的开源项目来分析内存溢出的问题。


  • 配置应用,为堆分析做准备


    任何像内存溢出这种非确定性的、时有时无的问题对于事后的分析都是一个挑战。所以,最好的处理内存溢出的方法是让 JVM 虚拟机转储一份 JVM 虚拟机内存状态的堆文件。


    Sun HotSpot JVM 有一种方法可以引导 JVM 转储内存溢出时的堆状态到一个文件中。其标准格式为 .hprof 。所以,为了实现这种操作,向 JVM 启动项中添加 XX:+HeapDumpOnOutOfMemoryError 。因为内存溢出可能经过很长一段时间才会发生,向生产系统增加这一选项也是必须的。


    如果堆转储 .hprof 文件必须被写在一个特定的文件系统位置,那么就添加目录途径到 XX:HeapDumpPath 。只需确保该应用对于指定目录途径始终拥有写入权限。


    原因分析


    101:了解内存溢出错误的本质


    当尝试去评估和了解一个内存溢出错误时,最先做的事情应该是观察内存增长特征。根据情况做出可能性的评估:


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

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


    拥有良性垃圾回收机制的健康图表

    健康一段时间后,随时间推移而泄露的图表


    引起内存使用凸起、导致内存溢出的内存图表


    在我们了解导致使用率激增的内存问题的本质之后,基于从对分析中得到的推断,下面的这些方法或许可以用来避免遭遇内存溢出的错误。


    解决内存问题


    1. 修复引起内存溢出的代码:由于应用在某段时间内增量添加了一个对象而没有清除其引用(来自正在运行的应用程序的对象引用),导致不得不修复程序错误。例如,这一错误可能是插入了一个哈希表, 其中的业务对象会逐渐增加,然而业务逻辑和事务在完成之后并没有删除这些对象。







    请到「今天看啥」查看全文