内存溢出

内存溢出

就是内存不够
通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了
主机内安装的内存所承受大小,就叫内存溢出

原因

1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据

2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收

3、代码中存在死循环或循环产生过多重复的对象实体

4、使用的第三方软件中的BUG

5、启动参数内存值设定的过小

解决方法

1、修改JVM启动参数,直接增加内存。

JVM默认可以使用的内存为64M
Tomcat默认可以使用的内存为128MB

在项目中,因为,启动参数使用的默认值
经常报OutOfMemory错误,需要设置-Xms,-Xmx参数

2、检查错误日志
查看OutOfMemory错误前,是否有其它异常或错误
仔细查看日志,分析内存溢出前做过哪些操作,可以大致定位有问题的模块

3、对代码进行走查和分析
找出可能发生内存溢出的位置

重点排查

1、检查代码中是否有死循环或递归调用
2、检查是否有大循环重复产生新对象实体
3、检查对数据库查询中,是否有一次获得全部数据的查询

一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。
这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出
因此,对于数据库查询尽量采用分页的方式查询

4、检查List、MAP等集合对象是否有使用完后,未清除的问题
因为,List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收

5、使用内存查看工具动态查看内存使用情况
内存查看工具,包括Optimizeit Profiler、JProbeProfiler、JinSight和Java1.5的Jconsole等

基本工作原理

监测Java程序运行时所有对象的申请、释放等动作
将内存管理的所有信息进行统计、分析、可视化
开发人员可以根据这些信息,判断程序是否有内存泄漏问题

常规方式
一般来说,一个正常的系统在其启动完成后,
其内存的占用量是基本稳定的,而不应该是无限制的增长的。

持续地观察系统运行时使用的内存的大小
可以看到在内存使用监控窗口中是基本规则的锯齿形的图线,

如果,内存的大小持续地增长,则说明系统存在内存泄漏问题。

通过间隔一段时间取一次内存快照
然后,对内存快照中对象的使用与引用等信息进行比对与分析
可以找出是哪个类的对象在泄漏

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值