欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记录-一些小知识点(内存)

程序员文章站 2022-06-03 22:46:52
...

垃圾回收机制方式及内存管理

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中不会做出恰当处理,此时要先手工移除事件,不然会存在内存泄露。


继续:内容继续





相关标签: 内存