内存溢出的定义和原因 如何解决内存溢出问题

本文章由注册用户 温暖·生活家 上传提供 评论 发布 纠错/删除 版权声明 0
摘要:内存溢出通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。此时软件或游戏就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件。那么你知道内存溢出的原因吗?应该如何解决内存溢出的问题呢?下面就和小编一起来看看详细知识吧!

一、内存溢出的定义和原因

定义

内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。为了解决Java中内存溢出问题,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(GarbageCollection,GC)完成的,程序员不需要通过调用GC函数来释放内存,因为不同的JVM实现者可能使用不同的算法管理GC,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是中断式执行GC。但GC只能回收无用并且不再被其它对象引用的那些对象所占用的空间。Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。

原因

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

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

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

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

5、启动参数设定的过小。

二、内存溢出的解决问题

第一步,就是修改JVM启动参数,直接增加内存。这一点看上去似乎很简单,但很容易被忽略。JVM默认可以使用的内存为64M,Tomcat默认可以使用的内存为128MB,对于稍复杂一点的系统就会不够用。在某项目中,就因为启动参数使用的默认值,经常报“OutOfMemory”错误。因此,-Xms,-Xmx参数一定不要忘记加。

第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。在一个项目中,使用两个数据库连接,其中专用于发送短信的数据库连接使用DBCP连接池管理,用户为不将短信发出,有意将数据库连接用户名改错,使得日志中有许多数据库连接异常的日志,一段时间后,就出现“OutOfMemory”错误。经分析,这是由于DBCP连接池BUG引起的,数据库连接不上后,没有将连接释放,最终使得DBCP报“OutOfMemory”错误。经过修改正确数据库连接参数后,就没有再出现内存溢出的错误。

查看日志对于分析内存溢出是非常重要的,通过仔细查看日志,分析内存溢出前做过哪些操作,可以大致定位有问题的模块。

第三步,安排有经验的编程人员对代码进行走查和分析,找出可能发生内存溢出的位置。重点排查以下几点:

1、检查代码中是否有死循环或递归调用。

2、检查是否有大循环重复产生新对象实体。

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

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

第四步,使用内存查看工具动态查看内存使用情况。某个项目上线后,每次系统启动两天后,就会出现内存溢出的错误。这种情况一般是代码中出现了缓慢的内存泄漏,用上面三个步骤解决不了,这就需要使用内存查看工具了。

内存查看工具有许多,比较有名的有:Optimizeit Profiler、JProbeProfiler、JinSight和Java1.5的Jconsole等。它们的基本工作原理大同小异,都是监测Java程序运行时所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。开发人员可以根据这些信息判断程序是否有内存泄漏问题。一般来说,一个正常的系统在其启动完成后其内存的占用量是基本稳定的,而不应该是无限制的增长的。持续地观察系统运行时使用的内存的大小,可以看到在内存使用监控窗口中是基本规则的锯齿形的图线,如果内存的大小持续地增长,则说明系统存在内存泄漏问题。通过间隔一段时间取一次内存快照,然后对内存快照中对象的使用与引用等信息进行比对与分析,可以找出是哪个类的对象在泄漏。

通过以上四个步骤的分析与处理,基本能处理内存溢出的问题。当然,在这些过程中也需要相当的经验与敏感度,需要在实际的开发与调试过程中不断积累。

声明:以上方法源于程序系统索引或网民分享提供,仅供您参考使用,不代表本网站的研究观点,证明有效,请注意甄别内容来源的真实性和权威性。申请删除>> 纠错>>

网站提醒和声明
本站为注册用户提供信息存储空间服务,非“MAIGOO编辑”、“MAIGOO榜单研究员”、“MAIGOO文章编辑员”上传提供的文章/文字均是注册用户自主发布上传,不代表本站观点,版权归原作者所有,如有侵权、虚假信息、错误信息或任何问题,请及时联系我们,我们将在第一时间删除或更正。 申请删除>> 纠错>> 投诉侵权>> 网页上相关信息的知识产权归网站方所有(包括但不限于文字、图片、图表、著作权、商标权、为用户提供的商业信息等),非经许可不得抄袭或使用。
提交说明: 快速提交发布>> 查看提交帮助>> 注册登录>>
相关推荐
电脑内存不足怎么办 计算机内存不足的9种解决方法
电脑内存决定着电脑的性能,充足的内存可以让电脑飞速运行,而内存不足会导致电脑慢如蜗牛。那么,如果电脑内存不足,我们应该怎么办呢?我们一共有九种方法可以解决此问题,重启计算机、关闭没用的程序、增加虚拟内存、增加可用磁盘空间、利用内存优化软件……具体内容一起来看看了解下吧!
内存条 电脑
3.4万+ 170
内存溢出的定义和原因 如何解决内存溢出问题
内存溢出通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。此时软件或游戏就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件。那么你知道内存溢出的原因吗?应该如何解决内存溢出的问题呢?下面就和小编一起来看看详细知识吧!
内存条 内存卡
8703 102
【PC台式电脑选购】什么配置的台式机好?台式电脑选购全攻略
在电脑市场上,占据份额最大的便是台式电脑,可台式机虽好用选购起来却有点麻烦,台式机的水比笔记本还深,我们稍微不留神就容易吃了亏。很多电脑小白想配一个好的电脑却不懂得什么配置的台式机好,难道我们就要白白被电脑城黑心老板骗去几百甚至上千的冤枉钱吗?甚至买到停产配件、老旧零件自己也不知道。下面这份精心写的台式电脑选购全攻略送给你,希望对你选购台式电脑有所帮助。
台式电脑 电脑 ★★★★
9760 72
【高配置电脑选购】如何选择高配置电脑 专业电脑硬件参数推荐
很多人想在有限的台式电脑预算中找出最高效的电脑配置,实现性价比的最大化,其实高配置的电脑的选择还是需要根据个人的需求来定,像对于玩游戏的电脑配置,一般需要看玩家的预算和平时玩什么游戏而定的,每一款游戏都有自身电脑配置要求,大多数的游戏倾向显卡的性能,显卡的性能好坏决定了游戏体验,当然CPU也是主要的,两者做到均衡才是最佳组合。下面这份高配置电脑清单还请各位想买电脑的小伙伴收好了。
电脑 台式电脑 ★★★★
5844 85
台式机内存条品牌网店排行榜 台式机内存条店铺推荐
2024年十大台式机内存条品牌网店排行榜出炉了,上榜的品牌有金士顿、芝奇、海盗船、威刚、科赋等,本榜单由CNPP大数据平台提供店铺数据支持,依据了网店的产品销量、店铺设计形象、用户评价/关注度、物流/售后服务、诚信经营等各项实力数据作为参考,由maigoo网进行综合整理而成的台式机内存条品牌网店排行榜名单。10大好牌子台式机内存条网店数据仅展示CNPP系统收录的店铺进行推荐,排名不分先后,如有疑问欢迎在末尾评论指正。