系统相关
首页 > 系统相关> > 内存泄漏与内存溢出简单理解

内存泄漏与内存溢出简单理解

作者:互联网

文章目录


前言

大家好,我是南城、有潇湘,一个有点文学气息的Java小白,如果我得文章对您有所帮助,不胜荣幸!!!

内存泄漏与内存溢出简单理解:

一.内存泄漏与内存溢出的概念?

内存溢出:(out of memory)指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,于是就发生了内存溢出。

内存泄漏:(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果(注意:只有强引用才会发生内存泄漏)

以上就是内存溢出和内存泄漏的基本概念,通俗的说,我们在内存中创建的对象,都是通过引用来使用的,但是但是当我们废弃一个对象的时候,如果内存仍然持有这个引用,那么垃圾回收机制是无法回收这个对象的,换言之,我们主观的决定这个对象不用了,但是内存并不知道我们的想法依旧持有对象,如果这种情况频繁发生,就会给内存造成极大的负荷,造成内存泄漏.
对于内存溢出,当内存泄漏占据的内存足够大时,我们去申请内存时,程序并不能提供给我们足够的内存,就会造成内存溢出,比如一个盘子本来可以放五个苹果,但是你临时放了一个橘子,但是之后你不需要这个橘子了,但是也没有地方放就只能放在盘子里,这个时候这个橘子就造成了内存泄漏,然后当我们去放五哥苹果的时候,正常来说盘子是够大的,但是现在因为橘子的原因,只能放四个苹果了,第五个放不进去,这个时候就是内存溢出.

二.内存泄漏与内存溢出的关系?

内存泄漏的堆积最终会导致内存溢出的产生.

三.引起内存溢出的可能原因?

常见的原因有五种:
①内存中加载的数据量过于庞大,如一次从数据库中取出过多的数据
②集合类中有对对象的引用,使用完后未清空
③代码中存在死循环或循环产生过多重复的实体对象
④使用的第三方软件中的bug
⑤启动参数内存值设定的过小

四.内存溢出解决方案

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

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

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

重点排查以下几点:
1.检查对数据库查询中,是否有一次获得全部数据的查询。数据库数据量过大时(十万条)一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
2.检查代码中是否有死循环或递归调用。
3.检查是否有大循环重复产生新对象实体。
4.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

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

一点点的文学气息

寄语:大鹏一日同风起,扶摇直上九万里。
作者笔录:诸君既有登天揽月之志,即无高踏之台给吾上乎?然今高踏之台,如池塘戏鱼虾之流,食饥之道,非吾之愿也。吾之志,上可登临望月辰,下可临渊观蛟龙,月辰不可触,亦上而抚之,蛟龙不可戏,亦下而降之。诸君年少乎?若年少,不可贪于池塘斤斤肥鱼而步不离,望北冥浩瀚而却步。守而鱼之,终有尽时,不若动而渔之,无穷尽矣。非乎?亦持老骥伏枥之心,汉升壮哉之志。吾之志,有其心而动,诸君共勉。

标签:泄漏,对象,之志,内存,橘子,溢出
来源: https://blog.csdn.net/weixin_42087031/article/details/112002175