Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

js中的垃圾回收 #2

Open
Abiel1024 opened this issue Mar 24, 2018 · 0 comments
Open

js中的垃圾回收 #2

Abiel1024 opened this issue Mar 24, 2018 · 0 comments

Comments

@Abiel1024
Copy link
Owner

Abiel1024 commented Mar 24, 2018

学习JavaScript几乎不会去考虑内存什么的问题,但自己如果仔细学习这部分内容。却能让你的代码更优美。

在编写前端代码的时候,几乎不会涉及到内存。那JavaScript是什么时候,什么情况,会回收内存呢?

收集机制: **JavaScript具有自动收集机制。**原理其实很简单,找出那些不在继续使用的变量。然后释放其占用的内存。以为是自动的,所以垃圾收集器会固定时间间隔以及代码执行中预订的时间周期性的执行收集操作。

标记清除(mark-and-sweep)

JavaScript中最常用的垃圾收集就是方式是标记清除。当变量进入环境时,就标记为‘进入环境’。当变量离开环境时,就标记为‘离开环境’。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(例如闭包)。在这些完成之后仍存在标记的就是要删除的变量了,因为环境中的变量已经无法访问到这些变量了,然后垃圾回收器相会这些带有标记的变量机器所占空间。
各大引擎的JavaScript实现使用的都是标记清除是的垃圾收集策略(或类似的策略),只不过垃圾收集的时间间隔互有不同。

引用计数(reference counting)

引用计数的含义就是当一个值被赋给另一个变量的时候,该值的引用次数加一。反之,如果包含对这个值引用的变量又取得另一个值,则引用册数减一。这样,当一个值的引用次数是0的时候,就说明这个值没办法再被访问了,就可以将其内存空间回收。当垃圾收集器下次再运行的时候,它就会释放那些引用次数为0的值所占的内存。
但是这个策略有一个严重的问题,比如

function test() {
    var testOne = {}
    var testTwo = {}
    testOne.haveObj = testTwo
    testTwo.haveObj = testOne
}

当函数执行完成,虽然两个对象都离开了作用域,但是引用计数却不会为0,就会导致无法清除。

管理内存

未来防止运行JavaScript的网页耗尽全部系统内存而导致系统崩溃,确保占用最少的内存能让页面获得最好的性能。最佳的方式,就是为执行中的代码只保存必要的数据。一旦数据不在使用,就将其设置为null来释放其引用——解除引用

例如在闭包中:

function CreatPerson() {
   var person = new Object();
   person.sayHello = function () {
       console.log('hello')
   }
   return person
}
var Bob = CreatPerson()

Bob = null     //手动解除Bob引用

因为全局存在Bob引用了CreatPerson作用域中的变量,会导致变量不会被清除。 当我们使用完成之后,可以收到将Bob设置为null,解除对person的引用。

不过解除一个值引用并不意味着自动回收改制所占用的内存。解除引用真正的作用是让值脱离执行环境,是它能被下次回收机制所回收。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant