当前位置:首页 > 内存 > 正文

内存泄漏和内存溢出(内存溢出和内存泄漏的区别)

  • 内存
  • 2024-06-04 11:23:32
  • 8578

一、简单说一说内存泄漏、内存溢出、内存碎片。内存中有三个内存区域供用户使用:
程序存储区、
静态存储区、
动态存储区。
程序数据通常存储在静态存储区和动态存储区中。
静态存储区域是程序启动时分配的固定内存区域。
动态存储区域一般是程序运行时根据需要动态分配和释放的内存区域。该内存区域在使用后需要开发者释放,动态分配的内存区域如果不释放就会发生内存泄漏。对应区域无法使用。
比如:有一个空杯子,可以装50ml的水,但是你需要往毯子里倒100ml的水,那么此时多余的水肯定会流出来,这就是水溢出。所以就内存而言,就是内存溢出。
内存碎片分为外部碎片和内部碎片
外部碎片是指尚未分配的碎片(不属于任何进程),但又太小被分配给新进程内存的Free区域用于内存空间。
外部片段是任何分配的区域或页面之外的空闲存储块。这个存储块数量可以满足当前应用的长度要求,但是由于地址不连续或者其他原因,系统无法满足当前应用。
内部碎片是已经分配的空间(可以清楚地表明进程拥有它)但无法使用;
内部碎片是内部的或页存储块中的空间。拥有该区域或页面的进程不使用该存储块。即使进程占用了这块存储空间,系统也无法使用它。在进程释放该内存块或进程终止之前,系统可能不会使用该内存块。
二、分不清的内存溢出、内存泄漏、内存越界OutOfMemory:内存溢出。当你看到英文名称时,它仅仅意味着该东西已经被使用过。即程序运行时请求的内存超过了系统能够提供的内存,导致无法申请到足够的内存。
MemoryLeak:内存泄漏,内存分配给临时变量,但使用后没有被GC回收,内存一直被占用。
Out-of-boundsAccessing:内存越界。在系统中申请了一块内存后,使用时超出了申请限制。
如果你还觉得不清楚,可以看下面的例子:
把记忆比作苹果,我有一本装饰书给我的朋友们玩,还有一个篮子。苹果(三个)(我很挑剔,玩完想还给我),我把最左边的苹果给了小红,最右边的苹果给了小明,中间的苹果留给了自己。
这时候,毛毛来找我要一个苹果,说要玩,但我没有。我告诉他OutOfApple(内存溢出),这意味着我已经没有你了,你可以下次再来。
小红玩的时候想抢中间的苹果,我就骂他,说这个苹果你不要拿,它不是你的。这就是越界访问(内存越界)。
当我和小红、小明玩完后,小红没有把苹果还给我。这是苹果泄漏(内存泄漏)。
如果像小红这样的朋友很多,每次玩都不归还苹果,那我总共就只有三个苹果了。很有可能有一天我无法把苹果送给其他朋友玩,甚至没有最后一个可以与朋友分享的苹果。所以内存泄漏会导致内存溢出。
更新:我突然意识到本章开头的随意想法实际上是合理的。内存溢出,水从容器里流出来,说明容器不够大,水已经溢出了。把容器当成内存,一切就都到位了!