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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谈谈垃圾回收机制方式内存管理?相关的知识,希望对你有一定的参考价值。

这是一道前端开发面试题,怎么答既专业又简短

1、原理

js按照固定的时间间隔找到不在继续使用的变量,释放其占用的内存。

 

2.实现方式

(1)标记清除

垃圾收集器给存储在内存上的所有变量都加上标记;

之后,去掉环境中的变量以及被环境引用变量的标记;

之后,被加上标记的变量就是准备删除的变量(原因是环境中的变量无法访问到这些变量了)。 

目前,IE、firefox、opera、chrome和Safari浏览器都是标记清除的垃圾回收策略,只是回收时间间隔不一样。

 

(2)引用计数

原理:记录每个变量被引用的次数。释放引用计数为0的变量所占用的内存。

IE9 将BOM和DOM对象转换成了真正的js对象。

 

3、管理内存

背景:分配给浏览器的可用内存通常会比桌面应用程序少。

因此,如何使用最少的内存让页面获得最优的性能,就需要考虑管理内存。

一个比较好的做法是:解除引用,即不再使用的变量设置为null。
参考技术A 下载个专门软件,对电脑进行监控,定期进行清理。定期对硬盘进行碎片整理。没有用的材料及时清理掉,保证电脑正常运行。数,然后来一个优质回答,因为现在优质回答实在是太难得到了,不得不这样。真心对不起。 对不起,这位陌生人。抱歉打扰到了您,我不是正经的来回答您的问者不需要太在意。而C++是自己手动处理的。如果你是高手也可以手动处理!不是每完成一个方法,回收一次垃圾,就会提高性能。相反,垃圾回收,也需要消耗·js按照固定的时间间隔找到不在继续使用的变量,释放其占用的内存。 参考技术B 对不起,这位陌生人。抱歉打扰到了您,我不是正经的来回答您的问题的,我只是想凑字数,然后来一个优质回答,因为现在优质回答实在是太难得到了,不得不这样。真心对不起。 对不起,这位陌生人。抱歉打扰到了您,我不是正经的来回答您的问题的,我只是想凑字数,然后来一个优质回答,因为现在优质回答实在是太难得到了,不得不对不起,这位陌生人。抱歉打扰到了您,我不是正经的来回答您的问题的,我只是想凑字数,然后来一个优质回答,因为现在优质回答实在是太难得到了,不得不这样。真心对不起。 对不起,这位陌生人。抱歉打扰到了您,我不是正经的来回答您的问题的,我只是想凑字数,然后来一个优质回答,因为现在优质回答实在是太难得到了,不得不这样。真心对不起。。真心对不起。 参考技术C 当电脑用了一段时间后,程序的运行速度越来越慢,电脑运行时的噪音也越来越大……心爱的电脑再也没有当初的颜色了,这到底是怎么回事?这主要是你没有对电脑进行维护。电脑也需要定期的进行维护,这样才能保证它正常运行。
当电脑用了一段时间后,程序的运行速度越来越慢,电脑运行时的噪音也越来越大……心爱的电脑再也没有当初的颜色了,这到底是怎么回事?这主要是你没有对电脑进行维护。电脑也需要定期的进行维护,这样才能保证它正常运行。
当电脑用了一段时间后,程序的运行速度越来越慢,电脑运行时的噪音也越来越大……心爱的电脑再也没有当初的颜色了,这到底是怎么回事?这主要是你没有对电脑进行维护。电脑也需要定期的进行维护,这样才能保证它正常运行。
参考技术D 当电脑用了一段时间后,程序的运行速度越来越慢,不时还出现蓝屏、死机等现象,电脑运行时的噪音也越来越大……心爱的电脑再也没有当初的颜色了,这到底是怎么回事?这主要是你没有对自己的电脑进行维护。电脑也需要定期的进行维护,这样才能保证它正常运行。如果你不知道如何来维护电脑,就跟着汉堡包一起来做吧。

javascript的垃圾回收机制和内存管理

垃圾回收

javascript不同于c、c++的一个特点是:具有自动的垃圾回收机制,这就意味着,开发人员可以专注于业务,而不必把过多精力放在内存的管理上,提高开发效率。
所谓的垃圾回收就是找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作。
目前在浏览器中,实现垃圾回收的方式主要有两种:
1.标记清除
也是javascript最常用的垃圾回收的方式。
在标记清除的方式中有两个概念:『进入环境』和『离开环境』。『进入环境』指变量进入执行的环境。『离开环境』指变量完成任务,离开了执行的环境。
垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。
2.引用计数
引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加 1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减 1。当这个值的引用次数变成 0 时,则说明没有办法再访问这 个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次再运行时,它就会释放那 些引用次数为零的值所占用的内存。
这种机制其实在js中并不常用,因为这种机制会产生循环引用的问题,『循环引用』指的是对象 A 中包含一个指向对象 B 的指针,而对象 B 中也包含一个指向对象 A 的引用。对于像js类的自动回收机制的语言来说,需要额外手动的去释放内存,其实并不友好。例如,在下面的例子中:

function garbage(){
    var A = new Object();
    var B = new Object();
    A.property = B; 
    B.property = A;
}

由于对象A、B相互引用,引用次数都为2,所以其占用的内存并不能被自动释放。
在IE的BOM和DOM中就采用了此类的引用计数,在IE9以后,微软转而使用了标记清除的方式来管理内存,从而避免了两种方式并存的局面。

内存管理

由于浏览器和其他桌面程序相比,系统分配给浏览器的内存相对较少,这样做的目的主要是出于安全方面的考虑,防止运行 JavaScript 的网页耗尽全部系统内存而导致系统崩溃。内存限制问题不仅会影响给变量分配内存,同时还会影响调用栈以及在一个线程中能够同时执行的语句数量。
因此,确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为 null 来释放其引用——这个做法叫做解除引用(dereferencing)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动被解除引用。

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

不过,解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离 执行环境,以便垃圾收集器下次运行时将其回收。

小结

JavaScript 是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题。可 以对 JavaScript 的垃圾收集例程作如下总结。

? 离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。
? “标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然
后再回收其内存。
? 另一种垃圾收集算法是“引用计数”,这种算法的思想是跟踪记录所有值被引用的次数。JavaScript
引擎目前都不再使用这种算法;但在 IE 中访问非原生 JavaScript 对象(如 DOM 元素)时,这种
算法仍然可能会导致问题。
? 当代码中存在循环引用现象时,“引用计数”算法就会导致问题。
? 解除变量的引用不仅有助于消除循环引用现象,而且对垃圾收集也有好处。为了确保有效地回
收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用。

---参考《JavaScript高级程序设计第3版》




















以上是关于谈谈垃圾回收机制方式内存管理?的主要内容,如果未能解决你的问题,请参考以下文章

从C和C++内存管理来谈谈JVM的垃圾回收算法设计-下

从C和C++内存管理来谈谈JVM的垃圾回收算法设计-下

从C和C++内存管理来谈谈JVM的垃圾回收算法设计-上

从C和C++内存管理来谈谈JVM的垃圾回收算法设计-上

javascript的垃圾回收机制和内存管理

垃圾回收机制与内存管理