java 内存溢出分析_JAVA内存溢出分析

开发多年,最近2年,经常遇到其他同行或者别的项目组在业务测试环境上,甚至还有的在生产环境上出现(多数是后台管理系统)OutOfMemory,直到我在实际开发中遇到,总结了以下几点,针对实际情况(拒绝扯蛋的)分析解决方案:

一 造成原因

很多人都说是代码编写不规范造成的,开发人员技术功底薄弱,不能及时释放内存。甚至,会有人建议将引用后的变量置成null值,让jvm的垃圾回收。(我想申明下,jvm的垃圾回收根据算法不同,回收的规则不同,针对新生代和年老代的回收频率也不一样,根据对象的引用的次数和当前所耗内存占比回收),上面的将引用后的置成null,可行,但不是必须的。

一般非生产环境上出现内存溢出,都是我们没有手动设置过jvm内存(一般情况,除非必须,测试环境都会使用默认的大小)。

开发人员功底确实也是很重要,数据量的大小,数据的存活周期,引用的三方jar工具类是否是占内存,代码循环变量,集合使用是否有造成内存溢出的潜在风险。

二  分析思路

生产环境上出现内存溢出,如果条件允许,查看 jmap -heap pid 实际内存消耗,可以动态查看内存占用和GC回收情况jstat -gcutil pid time,会展示出各个区域的情况;联合使用 jmap -histo:live  pid查看对象占用内存大小情况。找到耗内存的对象,针对代码优化。

三   解决方案

手动设置jvm内存大小,新生代和年老代的比例,永久代内存大小。

排查代码具体定位问题,一个批次的数据量比较大,造成的内存溢出,会采用分页方法处理数据。

引用三方jar出现的问题,考虑使用一些轻量级的工具类代替。

四 总结

内存溢出,宗旨是:尽量让对象在新生代多存活。代码优化到最优。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值