Android内存泄漏导致原因深入探究

时间:2023-04-27 14:27:13来源:互联网

下面小编就为大家分享一篇Android内存泄漏导致原因深入探究,具有很好的参考价值,希望对大家有所帮助。

什么是内存泄露

什么是内存泄露,通俗的来说就是堆中的一些对象已经不会再被使用了,但垃圾收集器却无法将它们从内存中清除。

内存泄漏很严重的问题,因为它会阻塞内存资源并随着时间的推移降低系统性能。如果不进行有效的处理,最终的结果将会使应用程序耗尽内存资源,无法正常服务,导致程序崩溃,抛出java.lang.OutOfMemoryError异常。

堆内存中通常有两种类型的对象:被引用的对象和未被引用的对象。被引用的对象是应用程序中仍然具有活跃的引用,而未被引用的对象则没有任何活跃的引用。

垃圾收集器会回收那些未被引用的对象,但不会回收那些还在被引用的对象。这也是内存泄露发生的源头。

哪些操作会造成内存泄漏

下面我们介绍几种常见的造成内存泄露的情况

1、意外声明全局变量是最常见也最容易修复的内存泄漏问题,比如:

function fn() {
    name = '张三';
}

解释器在解释上面的函数时,会把name当做全局变量,即window.name = ‘张三’。只要window对象没有被清理,那么name属性和属性值将一直存在,造成内存泄露。

解决方法:

(1)只要在变量声明前面加上var、let或const关键字即可,这样变量就会在函数执行完毕后离开作用域。

(2)使用this关键字

function fn() {
    this.name = '张三';
}

(3)可以在 JavaScript 文件开头添加 “use strict”,使用严格模式。这样在严格模式下解析 JavaScript 可以防止意外的全局变量

(4)在使用完之后,对其赋值为null或者重新分配

2、 定时器导致的泄露

let name = '张三';
setInterval(() => {
    console.log(name);
}, 100);

上面的代码中,只要定时器一直运行,回调函数中引用的name就会一直占用内存。

3、闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环),下面我们看一个JavaScript闭包导致的内训泄露例子

let fun = function() {
    let name = '张三';
    return function() {
        return name;
    };
};

调用fun()会导致分配给name的内存被泄漏。

本站部分内容转载自互联网,如果有网站内容侵犯了您的权益,可直接联系我们删除,感谢支持!