出现OutOfMemoryError时,通用解决思路

说一下,当我们的项目出现OutOfMemoryError时,一些简单的解决思路:

1.

  • 当java堆出现 OutOfMemoryError时可Linux中用jmap -dump:命令查看对象大小,当然一般都是用工具,比如常用的JProfiler查看分析Dump文件,查看都有哪些对象,那些对象占用空间较多,确定到底是内存泄漏(不在用到的对象还在堆里存活),一般引起泄漏的对象包括:String,char[],HashMap等,这些对象需要重点关注下。

  • 如果是内存泄漏,可使用JProfiler中的“Show In Graph”将引用关系使用图形方式展现,查看无用对象是通过怎样的路径和GC Roots相关联的导致垃圾回收器无法自动回收它们,确定泄漏对象类型信息和GC Roots引用链信息,就基本能定位到泄漏代码的位置。

  • 如果不存在泄漏,是内存溢出(所有的存活的对象都有用),那我会检查虚拟机的堆内存大小参数,与机器物理内存相比看是否还可以调大,还有就是从代码检查是不是有些对象生命周期过长,持有状态时间过长的情况,然后从这些代码入尝试减少程序运行期间内存消耗。

2.

  • 当我们在多线程项目中,当线程过多导致内存溢出,如果不能减少线程数和已经是64位虚拟机(操作系统可分配给进程的内存是有限制的,如果时32位系统换成64为系统可分配内存将会更多),可以通过减少最大堆容量和减少栈容量来换取更多的线程。

3.

  • 还有一种OutOfMemoryError情况是,Dump文件较小,并且在Dump文件看不到明显的异常,而程序中又直接或间接使用了NIO,则可能是本地直接内存溢出(DirectMemory)。

这只是较为简单通用的解决思路,不同项目各有情况。说的不对的地方希望大家可以指正补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值