欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 前端技术 > html >内容正文

html

浏览器的垃圾回收机制 -尊龙游戏旗舰厅官网

发布时间:2024/10/12 html 26 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 浏览器的垃圾回收机制 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

垃圾回收机制

垃圾收集器必须跟踪哪个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存,内存泄露和浏览器实现的垃圾回收机制息息相关, 而浏览器实现标识无用变量的策略主要有下两个方法:

引用计数

跟踪记录每个值被引用的次数。当声明一个变量并将引用类型的值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次 数加1.相反,如果包含对这个值引用的变量又取得另外一个值,则这个值的引用次数减1.当这个值的引用次数变成0时,则说明没有办法访问这个值了,因此就 可以将其占用的内存空间回收回来。

如: var a = {}; 对象{}的引用计数为1b = a; 对象{}的引用计数为 1 1a = null; 对象{}的引用计数为2-1

所以这时对象{}不会被回收;

ie 6, 7 对dom对象进行引用计数回收, 这样简单的垃圾回收机制,非常容易出现循环引用问题导致内存不能被回收, 进行导致内存泄露等问题, 如:

demo1: var btn = $("button"); btn.onclick = function(){//当这里也可以访问到btn,说明function内部存在btn的引用 };demo2:function a () {var x = { };var y = {};x.a = y;y.a = x; } a();函数a执行完后,本来x, y对象都应该在垃圾回收阶段被回收, 可是由于存在循环引用,也不能被回收。

标记清除(mark-and-sweep)

到2008年为止,ie,firefox,opera,chrome和safari的javascript实现使用的都是标记清除式的垃圾收集策略(或类似的策略),只不过垃圾收集的时间间隔互有不同。

标记清除的算法分为两个阶段,标记(mark)和清除(sweep). 第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除

markfromroots():worklist <- emptyfor each fld in rootsref <- *fldif ref != null && isnotmarked(ref) setmarked(ref)add(worklist,ref)mark() mark():while not isempty(worklist)ref <- remove(worklist) for each fld in pointers(ref) child <- *fldif child != null && isnotmarked(child)setmarked(child)add(worklist,child)sweep(start,end):scan <- startwhile scan < endif ismarked(scan)setunmarked(scan)elsefree(scan)scan <- nextobject(scan)atomic collect():markfromroots()sweep(heapstart,heapend)

转载于:https://www.cnblogs.com/mininice/p/3875437.html

总结

以上是尊龙游戏旗舰厅官网为你收集整理的浏览器的垃圾回收机制的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。

网站地图