内存溢出的原因有哪些?怎么解决?.docxVIP

内存溢出的原因有哪些?怎么解决?.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内存溢出的原因有哪些?怎么解决? 内存溢出 out of memory ,是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory; 比如申请了一个 integer, 但给它存了 long 才能存下的数,那就是内存溢出。那么当你遇到这种情况时该怎么办呢 ?今天小编为大家整理了一些解决 方法,下面我们一起来看看吧 ! 简介 内存泄漏是指你向系统申请分配内存进行使用 (new) ,可是使用完了以后却不归还 (delete) ,结果你申请到的那块内存你自己也不能再访问 (也许你把它的地址给弄丢了而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装 4 个果子,  ), 你装了  5 个,结果掉倒地上不能吃了。这就是溢出  !比方说栈,栈满时再做进栈必定产 生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存 不足以放下数据项序列 ,称为内存溢出 . 以发生的方式来分类,内存泄漏可以分为 4 类: 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。 从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户, 根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系 统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积, 而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测 到 内存溢出的原因以及解决方法 引起内存溢出的原因有很多种,小编列举一下常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据 ; 2.集合类中有对对象的引用,使用完后未清空,使得 JVM 不能回收 ; 3.代码中存在死循环或循环产生过多重复的对象实体 ; 4.使用的第三方软件中的 BUG; 5.启动参数内存值设定的过小 内存溢出的解决方案: 第一步,修改 JVM 启动参数,直接增加内存。 (-Xms , -Xmx 参数一定不要忘记 加。 ) 第二步,检查错误日志,查看 “OutOfMemory”错误前是否有其它异常或错误。 第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。 重点排查以下几点: 1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次 取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库 中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内 存溢出。因此对于数据库查询尽量采用分页的方式查询。 2.检查代码中是否有死循环或递归调用。 3.检查是否有大循环重复产生新对象实体。 4.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次 取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库 中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内 存溢出。因此对于数据库查询尽量采用分页的方式查询。 5.检查 List 、MAP 等集合对象是否有使用完后,未清除的问题。 List 、MAP 等集 合对象会始终存有对对象的引用,使得这些对象不能被 GC 回收。 第四步,使用内存查看工具动态查看内存使用情况。 扩展资料 数据类型超过了计算机字长的界限就会出现数据溢出的情况。导致内存溢出问题 的原因有很多,比如: 使用非类型安全 (non-type-safe) 的语言如 C/C++ 等。 以不可靠的方式存取或者复制内存缓冲区。 (3)编译器设置的内存缓冲区太靠近关键数据结构。 因素分析 1.内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界, 又不检查类型可靠性 (type-safety) 。众所周知,用 C/C++ 语言开发的程序由于目标代 码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。只要合

文档评论(0)

pengyou2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档