| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> JavaScript 性能优化,你知道引用计数算法实现原理了吗 -> 正文阅读 |
|
[JavaScript知识库]JavaScript 性能优化,你知道引用计数算法实现原理了吗 |
首先针对于引用技术算法来说,它的核心思想其实就是在内部去通过一个引用计数器来维护当前对象的引用数,从而去判断该对象的引用数值是否为 0,来决定它是不是一个垃圾对象。当这个数值为零的时候,那么 GC 就开始工作,将其所在的一个对象空间进行回收和释放在使用。 在这里提到了一个名词叫引用计数器。关于它我们需要有一个小小的印象。因为相对于其他的一些 GC 算法来说,也正是由于引用计数器的存在,那么导致了引用计算在执行效率上,可能与其他的机器算法有所差别。 这个介绍以后,我们还需要去再思考一下,我们引用的这样一个数值什么时候会发生改变呢?所以在这里它给出的一个规则是这样的,当某一个对象它的一个引用关系去发生改变的时候,那么引用计数器就会主动的去修改当前这个对象所对应的引用数值。 那什么叫做引用关系发生改变呢?例如我们的代码里面,现在有一个对象空间。目前来说有一个变量名指向它,那么这个时候就把数值加 1。如果在这个时候又多了一个对象还指向它,那么就把它再加 1。那么如果是减少的情况下,就减 1 就行了。 当我们发现这样的一个引用数字为 0 的时候,那么 GC 就会立即工作,然后将当前的对象空间进行回收。 那么介绍这样的一块原理之后,我们再通过一些简单的代码来说明一下这个引用关系发生改变的一种情况。 通过编写一些简单的代码片段,来看一下当前代码中针对于对象引用技术发生改变的一些现象。 使用 const 关键字定义几个简单的变量,设置一下,把它作为一个普通的对象,采用的是数值写起来比较方便。
再去定义一个数组。然后在数组的里边,在这个数组中去存放上述几个对象当中的 age 属性值。
我们接着往下再去做一个函数的定义,写一个普通的函数,然后在外层去调用这样一个函数。
那写完这段代码以后,去发其实并没有什么输出。只是用它来分析一下当前这里边所谓的叫引用数值的一个变更。 首先,从全局的角度去考虑,会发现 Window 的下边是可以直接找到 user1、user2、user3 以及数组 ageList。。同时 fn 函数中定义 num1 和 num2,由于我们没有去设置关键字,所以它同样是被挂载在当前的这样一个 Window 对象下的。所以这个时候对于这些变量来说,它们的引用计算肯定都不是 0。 然后紧接着我们去做一些修改,比如在fn 函数中定义的 num1 和 num2 加上 const 关键字的声明。
使用关键字的声明之后,就意味着当前 num1 和 num2,它只能在这样的一个作用域内起效果了。所以一旦当外部函数调用执行结束之后,那么我们在外部全局的地方去触发,就不能够再找到 num1 和 num2 了。这个时候,num1 和 num2 自身的一个引用计算就会回到 0。 此时此刻,只要是 0 的情况下,GC 就会立即开始工作,将它们当做垃圾去进行一个对象回收。也就是这个时候函数执行完成以后,他们内部所在的一个内存空间就会被回收掉。 紧接着再来看一下其他的,比如user1、user2、user3 以及 ageList。由于 ageList 刚好都指向了 user1、user2、user3 这三个对象空间。所以当 JavaScript 脚本使执行完一次以后,发现 user1、user2、user3 它们里边的空间其实都还被引用着。 此时的引用计数器不是 0,那么这个时候就不会被当做垃圾进行回收。以上就是关于引用计算算法在实现过程中它所遵循的一些基本原理。 简单的总结一下,其实就是靠着当前对象身上的一个引用计算的数值来判断是否为 0,从而决定它是不是一个垃圾对象。 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 2:29:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |