关于内存泄漏

事情又回到了JS的回收机制上。当一个人被忘记的时候,在某种意义上,这个人就消失了。JS的变量也是如此,当没有东西引用它的时候它就消失了。而它的存在亦是如此。

对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak) ------------ 阮一峰

传送门1:http://www.ruanyifeng.com/blog/2017/04/memory-leak.html
传送门2:http://www.cnblogs.com/libin-1/p/6013490.html
传送门3:http://www.cnblogs.com/snowwhite/p/6067571.html

内存被垃圾回收机制释放 的现场。 arr 重置为 null。解放了对[1,2,3,4]的引用。引用次数归零。内存被释放出来。

let arr = [1,2,3,5];
console.log('hello world');
arr = null;

下面的是阿里巴巴的笔试题目

1.内存泄露了,如果li包含在ul中,我们引用了ul,li,只是把ul删除了,但是li还是被记住了,所以实际上他们没有消亡(归结为:dom清空或删除时,事件未清除导致的内存泄漏)

var ul=document.querySelector('#ul');
var li=document.querySelector('#li');
document.querySelector('body').removeChild(ul);

2.内存泄露(种类:意外的全局变量),this此时为全局(浏览器中为window),不会被回收.一个简单的字符串泄露并不会造成很大的危害,但这无疑是错误的.

function add(){
	this.ali={}
}
add();

3.只是普通对象,所以不会产生泄露。对于纯粹的 ECMAScript 对象而言,只要没有其他对象引用对象 a、b,也就是说它们只是相互之间的引用,那么仍然会被垃圾收集系统识别并处理。但是,在 Internet Explorer 中,如果循环引用中的任何对象是 DOM 节点或者 ActiveX 对象,垃圾收集系统则不会发现它们之间的循环关系与系统中的其他对象是隔离的并释放它们。最终它们将被保留在内存中,直到浏览器关闭。

var a={};
var b=a;
a.name=b;
b.name=a;

4.(待更,怪本人用jquery用的时间太短)

$('ul').on('click','li',function(){
	console.log($(this).text());
})

5.闭包泄露,局部变量被函数所引用,son清除不能。

var par=(function(){
	var son='ali';
	return function(){
		console.log(son);
	}
})()

6.(存疑,时代不一样了)可能会泄露,因为若是_n本身绑定有click事件,此处直接使用innerHTML却没有消除原先的事件会有大问题的。

setInterval(function(){
	var _n=document.getElementById('Node');
	if(node){
		_n.innerHTML='ali';
	}
},1000);
posted @ 2017-10-21 15:51  海客无心x  阅读(271)  评论(0编辑  收藏  举报