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

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

  • 内存
  • 2024-06-29 11:04:59
  • 605

一、内存溢出和内存泄漏的区别品牌型号:华为MateBookD15
系统:Windows11

内存溢出是指程序使用内存时,没有足够的内存空间可以使用,出现outofmemory;例如,当请求Integer内存时,但是里面存储了一个只能存储长度的数字,这就是内存溢出。

内存泄漏是指程序使用内存后,无法释放所分配的内存空间。内存泄漏的危害可以忽略不计,但是内存泄漏累积的结果是严重的大量内存,迟早会被占领的。

内存泄漏可以分为4类:

1频繁的内存泄漏。存在内存泄漏的代码会被执行多次,每次执行都会造成内存泄漏。

2.偶尔会出现内存泄漏。导致内存泄漏的代码只会在某些条件或操作下发生。频繁和偶发是相对的。在某些情况下,偶尔的事情可能会成为常态。所以测试环境和测试方法对于检测内存泄漏很重要。

3.一次内存泄漏。导致内存泄漏的代码只会执行一次,或者由于算法缺陷,总会有且只有一个泄漏的内存块。例如,如果在类的构造函数中分配了内存,但在析构函数中没有释放内存,则内存泄漏只会发生一次。

4.隐式内存泄漏。程序在运行时不断分配内存,但在运行结束之前不会释放内存。严格来说,这里不存在内存泄漏,因为程序最终会释放所有请求的内存。但对于需要运行数天、数周或数月的服务器程序来说,未能及时释放内存也可能导致最终耗尽所有系统内存。因此,我们将这种类型的内存泄漏称为隐式内存泄漏。


二、Android内存溢出和内存泄漏的区别内存溢出是指当对象的内存使用超过分配的空间时抛出未处理的异常。例如,常见的内存溢出情况包括:位图太大,或者图像尺寸远大于显示空间。通常需要进行扩展以减少存储需求。
内存泄漏(MemoryLeak)
有些对象的生命周期是有限的。当他们的任务完成后,他们就会被收集到垃圾桶里。如果在对象生命周期结束时该对象仍然被一系列引用所引用,这就会导致内存泄漏。随着泄漏的累积,应用程序会耗尽内存。
例如,在调用roy()后,视图树及其关联的位图应该被垃圾收集。如果正在运行的后台线程继续持有对此活动的引用,则关联的内存将不会被回收,最终导致OutOfMemoryError崩溃。
内存泄漏
最终会导致
内存不足

如,这是使用MAT工具查找内存泄漏的结果。一个例子是
Handle
延迟发送
Message
onclose
Activity
破坏上下文导致的泄漏
是有针对性的测试,所以在实际开发中问题不容易被发现,也很难发现。泄漏积累到一定程度就会导致
OOM

三、内存溢出和内存泄漏的区别?产生原因以及解决方案。

内存溢出OutofMemory是指程序申请内存时,没有足够的内存空间供其使用,发生OutOfMemory;比如申请一个整数,但是里面可以存一个long,那就是内存溢出。
内存泄漏是指程序申请内存后无法释放所分配的内存空间。内存泄漏的危害可以忽略不计,但内存泄漏的累积后果却很严重。不管内存有多大,迟早都会被占用。
Memoryak最终会导致内存不足!

原因:

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

2.集合类中有对象的引用,使用后没有清除,导致JVM无法回收;

3.代码中存在无限循环或者循环生成过多的重复对象实体;

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

5.启动参数内存值设置太小

解决办法:

1)在处理部分IO流的数据传输时,尝试最后关闭IO流

2)处理下载的照片时,使用s。设置insameplesize()方法对图片进行压缩,以减少资源占用;下面专门写一篇关于图片压缩的文章;

3)还可以通过减少照片像素来减少内存占用

4)资源回收:e()bitmap=null;

5)尽量使用全局变量,避免新建对象