Javascript垃圾回收浅析

简介:

   接上篇《JS特性性能缺陷及JIT的解决方案》,这里总结下的Javascript垃圾回收机制。

 

一. 枚举Javascript引擎分配内存的场景:

1. Object

new Object();
new MyConstructor();
{ a: 4, b: 5 }
Object.create();

2. 数组

new Array();
[ 1, 2, 3, 4 ];

3. 字符串

new String(“hello hyddd”);
“<p>” + e.innerHTML + “</p>”

    随带一说,javascript的字符串和.Net一样,使用资源池和copy on write方式管理字符串。

4. 函数对象

var x = function () { ... }
new Function(code);

5. 闭包

function outer(name) {
var x = name;
return function inner() {
  return “Hi, “ + name;
}
}

    闭包和prototype不一样,以上函数为例,当调用outer时,会生成并返回一个对象(隐含变量x),每次调用都创建一个,而prototype则是每次都返回同一个而对象(即:无论多少次调用,只创建一个对象)。

 

二. GC方案

    相对其他语言的复杂的GC方案,Javascript的GC相对还是比较简单的。

 

1. Javascript引擎基础GC方案是(simple GC):mark and sweep(标记清除),即:

(1)遍历所有可访问的对象。

(2)回收已不可访问的对象。

 

2. GC的缺陷

    和其他语言一样,javascript的GC策略也无法避免一个问题:GC时,停止响应其他操作,这是为了安全考虑。而Javascript的GC在100ms甚至以上,对一般的应用还好,但对于JS游戏,动画对连贯性要求比较高的应用,就麻烦了。这就是新引擎需要优化的点:避免GC造成的长时间停止响应。

 

3. GC优化策略

    David大叔主要介绍了2个优化方案,而这也是最主要的2个优化方案了:

(1)分代回收(Generation GC)

    这个和Java回收策略思想是一致的。目的是通过区分“临时”与“持久”对象;多回收“临时对象”区(young generation),少回收“持久对象”区(tenured generation),减少每次需遍历的对象,从而减少每次GC的耗时。如图:

    1

    这里需要补充的是:对于tenured generation对象,有额外的开销:把它从young generation迁移到tenured generation,另外,如果被引用了,那引用的指向也需要修改。

 

(2)增量GC

    这个方案的思想很简单,就是“每次处理一点,下次再处理一点,如此类推”。如图:

    2

    这种方案,虽然耗时短,但中断较多,带来了上下文切换频繁的问题。

 

4. 总结

    因为每种方案都其适用场景和缺点,因此在实际应用中,会根据实际情况选择方案。

    比如:低 (对象/s) 比率时,中断执行GC的频率,simple GC更低些;如果大量对象都是长期“存活”,则分代处理优势也不大。



本文转自hyddd博客园博客,原文链接:http://www.cnblogs.com/hyddd/archive/2013/02/07/2908598.html,如需转载请自行联系原作者。


目录
相关文章
|
5月前
|
JavaScript 算法 前端开发
JS垃圾回收机制的原理
JS垃圾回收机制的原理
|
5月前
|
JavaScript 前端开发 算法
Java Script 中的垃圾回收机制有哪些缺点
Java Script 中的垃圾回收机制有哪些缺点
54 0
|
1月前
|
JavaScript 前端开发 Java
JavaScript基础知识-垃圾回收
关于JavaScript垃圾回收基础知识的介绍。
30 1
JavaScript基础知识-垃圾回收
|
2月前
|
前端开发 JavaScript Java
揭开 JavaScript 垃圾回收的秘密——一场与内存泄漏的生死较量,让你的代码从此焕然一新!
【8月更文挑战第23天】本文通过多个实例深入探讨了JavaScript中的垃圾回收机制及其对应用性能的影响。首先介绍了基本的内存管理方式,随后分析了变量不再使用时的回收过程。接着,通过事件监听器未被移除及全局变量管理不当等场景展示了常见的内存泄漏问题。最后,文章介绍了使用`WeakRef`和`FinalizationRegistry`等现代API来有效避免内存泄漏的方法。理解并运用这些技术能显著提升Web应用的稳定性和效率。
79 0
|
4月前
|
JavaScript 前端开发 算法
【JavaScript】JavaScript 垃圾回收机制深度解析:内存管理的艺术
JavaScript的内存管理和垃圾回收机制涉及栈内存与堆内存、引用计数与标记-清除算法。栈内存存储基本类型和函数调用时的局部变量,而堆内存用于复杂数据类型,如对象和数组。垃圾回收主要通过标记-清除策略,处理不再被引用的对象。现代引擎如V8使用分代收集和增量标记等优化方法,减少停顿并提升性能。开发者应注意避免内存泄漏,如及时解除引用、管理DOM引用和定时器,使用WeakMap和WeakSet等。理解这些原理和最佳实践对于编写高效代码至关重要。
99 5
|
3月前
|
存储 JavaScript 算法
你真的了解JS垃圾回收机制吗?
你真的了解JS垃圾回收机制吗?
25 0
|
3月前
|
自然语言处理 前端开发 JavaScript
前端 JS 经典:闭包与内存泄漏、垃圾回收
前端 JS 经典:闭包与内存泄漏、垃圾回收
34 0
|
4月前
|
JavaScript 前端开发 算法
JavaScript 使用自动垃圾回收机制来管理内存
JavaScript 使用自动垃圾回收机制来管理内存
29 0
|
4月前
|
JavaScript 前端开发 算法
JavaScript的垃圾回收机制
JavaScript的垃圾回收机制
23 0
|
4月前
|
JavaScript 前端开发 算法
JS垃圾回收机制
JS垃圾回收机制