电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

談談JavaScript中的垃圾回收機制

瀏覽:55日期:2023-10-13 08:29:22

JavaScript 具有自動垃圾收集機制,也就是說,執行環境會負責管理代碼執行過程中使用的內存。

在編寫 JavaScript 程序時,開發人員不用再關心內存使用問題,所需內存的分配以及無用內存的回收完全實現了自動管理。

這種垃圾收集機制的原理其實很簡單:找出那些不再繼續使用的變量,然后釋放其占用的內存。為此,垃圾收集器會按照固定的時間間隔(或代碼執行中預定的收集時間), 周期性地執行這一操作。

具體到瀏覽器中的實現,則通常有兩個策略,分別為標記清除和引用計數。

一、標記清除

JavaScript 中最常用的垃圾收集方式是標記清除(mark-and-sweep)。當變量進入環境(例如,在函數中聲明一個變量)時,就將這個變量標記為“進入環境”。而當變量離開環境時,則將其標記為“離開環境”。

垃圾收集器在運行的時候會給存儲在內存中的所有變量都加上標記。可以使用任何標記方式,比如,可以通過翻轉某個特殊的位來記錄一個變量何時進入環境, 或者使用一個“進入環境的”變量列表及一個“離開環境的”變量列表來跟蹤哪個變量發生了變化。

然后,它會去掉環境中的變量以及被環境中的變量引用的變量的標記。而在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環境中的變量已經無法訪問到這些變量了。

最后,垃圾收集器完成內存清除工作,銷毀那些帶標記的值并回收它們所占用的內存空間。

二、引用計數

另一種不太常見的垃圾收集策略叫做引用計數(reference counting)。引用計數的含義是跟蹤記錄每個值被引用的次數。

當聲明了一個變量并將一個引用類型值賦給該變量時,則這個值的引用次數就是 1。 如果同一個值又被賦給另一個變量,則該值的引用次數加 1。相反,如果包含對這個值引用的變量又取得了另外一個值,則這個值的引用次數減 1。

當這個值的引用次數變成 0 時,則說明沒有辦法再訪問這個值了,因而就可以將其占用的內存空間回收回來。

這樣,當垃圾收集器下次再運行時,它就會釋放那些引用次數為零的值所占用的內存。

存在的問題:只要在 IE 中涉及 COM(Component Object Model,組件對象模型)對象,就會存在循環引用的問題。如下面代碼所示:

var element = document.getElementById('some_element');var myObject = new Object();myObject.element = element;element.someObject = myObject;

這個例子在一個 DOM 元素(element)與一個原生 JavaScript 對象(myObject)之間創建了循環引用。

其中,變量 myObject 有一個名為 element 的屬性指向 element 對象。

而變量 element 也有 一個屬性名叫 someObject 回指 myObject。

由于存在這個循環引用,即使將例子中的 DOM 從頁面中移除,它也永遠不會被回收。

解決方法:最好是在不使用它們的時候手工斷開原生 JavaScript 對象與 DOM 元素之間的連接。

myObject.element = null;element.someObject = null;

將變量設置為 null 意味著切斷變量與它此前引用的值之間的連接。當垃圾收集器下次運行時,就會刪除這些值并回收它們占用的內存。

三、管理內存

確保占用最少的內存可以讓頁面獲得更好的性能。而優化內存占用的最佳方式,就是為執行中的代碼只保存必要的數據。

一旦數據不再有用,最好通過將其值設置為 null 來釋放其引用——這個做法叫做解除引用(dereferencing)。

這一做法適用于大多數全局變量和全局對象的屬性。局部變量會在它們離開執行環境時自動被解除引用,如下面這個例子所示:

function createPerson(name){ var localPerson = new Object(); localPerson.name = name; }var globalPerson = createPerson('Nicholas');globalPerson = null; // 手工解除globalPerson 的引用

   變量 globalPerson 取得了 createPerson()函數返回的值。在 createPerson() 函數內部,我們創建了一個對象并將其賦給局部變量localPerson,然后又為該對象添加了一個名為 name 的屬性。最后,當調用這個函數時,localPerson 以函數值的形式返回并賦給全局變量 globalPerson。

由于 localPerson 在 createPerson()函數執行完畢后就離開了其執行環境,因此無需我們顯式地去為它解除引用。

但是對于全局變量 globalPerson 而言,則需要我們在不使用它的時候手工為它解除引用,這也正是上面例子中最后一行代碼的目的。

以上就是談談JavaScript中的垃圾回收機制的詳細內容,更多關于JavaScript 垃圾回收的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 达利园物流科技集团-| 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 深圳市源和塑胶电子有限公司-首页 | 粉丝机械,粉丝烘干机,粉丝生产线-招远市远东粉丝机械有限公司 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 德州网站制作 - 网站建设设计 - seo排名优化 -「两山建站」 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 硅胶制品-硅橡胶制品-东莞硅胶制品厂家-广东帝博科技有限公司 | 派财经_聚焦数字经济内容服务平台 | 合肥地磅_合肥数控切割机_安徽地磅厂家_合肥世佳电工设备有限公司 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 | 广东青藤环境科技有限公司-水质检测 | 七维官网-水性工业漆_轨道交通涂料_钢结构漆 | 除尘布袋_液体过滤袋_针刺毡滤料-杭州辉龙过滤技术有限公司 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 便民信息网_家电维修,家电清洗,开锁换锁,本地家政公司 | 环压强度试验机-拉链拉力试验机-上海倾技仪器仪表科技有限公司 | 电渗析,废酸回收,双极膜-山东天维膜技术有限公司 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 喷播机厂家_二手喷播机租赁_水泥浆洒布机-河南青山绿水机电设备有限公司 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 泰安塞纳春天装饰公司【网站】 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 软装设计-提供软装装饰和软装配饰及软装陈设的软装设计公司 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 清水混凝土修复_混凝土色差修复剂_混凝土色差调整剂_清水混凝土色差修复_河南天工 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 阜阳在线-阜阳综合门户| 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 |