记录-一些小知识点(内存)
垃圾回收机制方式及内存管理
1,回收机制方式
1.1定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存。
1.2原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。
function fn1() {
var obj = {name: 'hanzichi', age: 10};
}
function fn2() {
var obj = {name:'hanzichi', age: 10};
return obj;
}
var a = fn1();
var b = fn2();
fn1定义的obj为局部变量,而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。
1.3垃圾回收策略:标记清除(常用)和引用计数。
标记清除:
定义和用法:当变量进入环境时,将变量标记“进入环境”,当变量离开环境时,标记为“离开环境”。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。
到目前为止,IE,Firefox,Opera,chrome,Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。
引用计数:
定义和用法:引用计数是跟踪记录每个值被引用的次数。
基本原理:即使变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。
2,内存管理
2.1 什么时候触发垃圾回收
垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考的问题。
IE6的垃圾回收是根据内存的分配量运行的,当环境中的变量,对象,字符串达到一定数量时触发垃圾回收。垃圾回收器一直处于工作状态,严重影响浏览器性能。
IE7中,垃圾回收器会根据内存分配量与程序占用内存的比例进行动态调整,开始回收工作。
2.2 合理的GC方案:(1)遍历所有可访问的对象 (2)回收已不可访问的对象。
2.3 GC缺陷:停止响应其他操作
2.4 GC优化策略:分代回收(Generation GC)(2)增量GC
这部分是转载,GC具体还不了解,之后加深。
手动触发JavaScript垃圾回收行为
垃圾回收,GC。
“手动”指有效的、显示的、可控的触发浏览器JavaScript引擎的垃圾回收行为,比如通过点击页面中的按钮来调用js方法,或使用浏览器提供的功能。
IE
IE提供了一个未公开的js方法CollectGarbage()。至少在IE8仍然存在此方法。
if(typeof window.CollectGarbage === 'function'){
CollectGarbage();
}
Opera
旧版(非Blink)的Opera7+似乎也有一个手动触发GC的js方法。
window.opera.collect();
Firefox
Components.utils.forceGC()
window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils)
.garbageCollect()
区别在于前者只触发js引擎内的垃圾回收,而后者还可以处理XPCOM对象的回收。对分析网页内的垃圾回收行为来说,前者足够了。
在最新的Firefox中,上述方法可能已失效(无法直接在控制台直接调用),也可能这些方法只能在Firefox扩展中使用。
更新:在 Firefox 3.6 中也无法直接使用上述方法。
更新:有一个扩展 MemChaser 似乎允许手动触发 GC。
更新:Firefox 在 about:memory
页面中原生提供了详细的内存监控功能,但结合上述扩展使用似乎更方便一些
Chrome
Chrome的DevTools对js的垃圾回收和内存泄露提供了强大的分析工具,在DevTools的“Timeline”页面可以手动点击“CollectGarbage”按钮来触发GC。
只是内容,现在还不太理解。转载:手动回收垃圾
开发过程中遇到的内存泄露情况,如何解决
1,定义和用法
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。C#和java等语言采用了自动垃圾回收方法管理方式,几乎不会存在内存泄露。浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露。
2,内存泄露的几种情况
(1)当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会做出恰当处理,此时要先手工移除事件,不然会存在内存泄露。
继续:内容继续
上一篇: Linux中的常用内存问题检测工具