0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

内存溢出的原因以及解决方法

开山师傅 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-06-01 11:31 次阅读

内存溢出 ,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出.

以发生的方式来分类,内存泄漏可以分为4类:

1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

memory leak会最终会导致out of memory!

内存溢出的原因以及解决方法

引起内存溢出的原因有很多种,小编列举一下常见的有以下几种:

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

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

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

4.使用的第三方软件中的BUG;

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

内存溢出的解决方案:

第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)

第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

重点排查以下几点:

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

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

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

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

第四步,使用内存查看工具动态查看内存使用情况。

推荐几款检查内存泄露的软件:

pYYBAGKW3WuAT_TIAAEBk7uB5uY506.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4717

    浏览量

    68198
  • 内存泄漏
    +关注

    关注

    0

    文章

    39

    浏览量

    9192
收藏 人收藏

    评论

    相关推荐

    内存故障及解决方法

    内存故障及解决方法(一)按下电源开关后电脑不启动、黑屏故障的解决   电脑开机后就要自检内存,但是此时因为以下几个方面的原因,就可能造成开机无显示的故障。  1、
    发表于 06-16 13:16

    STM32堆栈溢出会出现的问题及溢出原因分析和解决方法

    `在开发过程中,我们有时候可能会遇到数据错误的情况,而这个情况发生多数是由于堆栈溢出导致,这里我们将详细讲解复现堆栈溢出会导致的问题及提供相应的解决方法。1 .建立一个测试工程定义主函数定义堆栈地址
    发表于 12-09 10:00

    java内存溢出排查方法解析

     内存溢出(out of memory),通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存
    发表于 11-28 13:57 6728次阅读

    加湿器不喷雾的原因解决方法

    在使用加湿器的过程中发现不喷雾或喷雾小了是什么原因呢?有什么解决方法
    的头像 发表于 04-04 16:09 2.8w次阅读

    内存溢出内存泄露的区别_内存溢出原因以及解决方法

    内存溢出内存泄露的区别是什么?内存溢出怎么解决?内存溢出
    发表于 06-01 10:27 2876次阅读

    舵机常见的故障原因分析以及解决方法

    舵机的分析方法和注意事项,以及对舵机常见故障的解决方法进行一个列举。
    的头像 发表于 09-22 10:14 3673次阅读
    舵机常见的故障<b class='flag-5'>原因</b>分析<b class='flag-5'>以及</b><b class='flag-5'>解决方法</b>

    如何解决内存溢出

    ,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免 其实很简单,
    的头像 发表于 09-25 10:54 1367次阅读
    如何解决<b class='flag-5'>内存</b><b class='flag-5'>溢出</b>

    电感啸叫的常见原因以及解决方法

    电子发烧友网站提供《电感啸叫的常见原因以及解决方法.docx》资料免费下载
    发表于 10-15 11:03 2次下载

    变频器过热的故障原因解决方法

    变频器过热的故障原因解决方法
    的头像 发表于 10-24 10:09 5441次阅读

    java内存溢出的几种原因和解决办法

    内存,但是如果程序中存在内存泄漏(Memory Leak)或者使用不当的数据结构等问题,仍然有可能导致内存溢出。下面将详细介绍Java内存
    的头像 发表于 11-23 14:44 5924次阅读

    java内存溢出排查方法

    Java内存溢出(Memory overflow)是指Java虚拟机(JVM)中的堆内存无法满足对象分配的需求,导致程序抛出OutOfMemoryError异常。内存
    的头像 发表于 11-23 14:46 3003次阅读

    jvm内存溢出故障排查

    溢出故障排查的方法和步骤。 确认内存溢出错误 首先,我们需要确认应用程序是否确实发生了内存溢出
    的头像 发表于 12-05 11:04 747次阅读

    jvm内存溢出该如何定位解决

    在Java应用程序中,JVM(Java虚拟机)内存溢出是指Java应用程序试图分配的内存超过了JVM所允许的最大内存大小,导致程序无法正常执行。内存
    的头像 发表于 12-05 11:05 1250次阅读

    内存溢出内存泄漏:定义、区别与解决方案

    内存溢出内存泄漏:定义、区别与解决方案  内存溢出内存泄漏是计算机科学中常见的问题,在开发和
    的头像 发表于 12-19 14:10 2289次阅读

    PCB焊盘脱落的原因解决方法

    PCB焊盘脱落的原因解决方法? PCB(印刷电路板)焊盘的脱落是一个常见的问题,它会导致电子设备无法正常工作。本文将详细介绍焊盘脱落的原因以及解决
    的头像 发表于 01-18 11:21 5735次阅读