垃圾回收与内存管理

垃圾回收机制

Javascript采用 自动垃圾收集机制,执行环境会负责跟踪代码执行过程中使用的内存,而在C和C++类的语言中,需要开发人员手工跟踪内存的使用情况。

该机制的实现原理:找出那些不再继续使用的变量,然后释放其占用的内存,为此,垃圾收集器会按照固定的时间间隔周期性的执行这一操作。

javascript的垃圾回收机制会将变量分为两大类:函数内的局部变量 和 非局部变量。因为,局部变量只在函数执行的过程中存在,在函数执行的过程中,为局部变量在栈或堆内存上分配相应的空间,函数执行完毕,释放局部变量占用的内存空间,变量被销毁;而对于非局部变量,垃圾收集器就需要跟踪变量,判断哪些没用了,打上标记,这种标记策略因浏览器而异,通常有两种。

1. 标记清除

垃圾收集器在运行的时候给存储在内存中的所有变量都加上标记,然后,它会去掉执行环境中的变量和已经被环境引用的变量的标记。在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清理工作。销毁那些带标记的值并回收他们所占用的内存空间。

到2008年为止,IE、Fireforx、Opera、Chrome和Safari采用的都是这种垃圾收集策略,只是收集的时间间隔不同。

2. 引用计数

引用计数的含义是跟踪记录每个值被引用的次数,当值的引用次数为0时,将其占用的内存空间回收,当垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占用的内存。

但该方法存在一个很大的漏洞,当遇到循环引用(对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的指针)时,会出现大量的内存得不到回收。

目前,大部分浏览器都不采用这种方式,除了IE。IE中有一部分对象并不是原生的javascript对象,例如DOM和BOM中的对象是使用C++以COM(Component Object Model,组件对象模型)对象的形式实现的。

管理内存

Javascript为了安全性以及防止运行javascript的网页耗尽全部系统内存而导致系统崩溃,分配给Web浏览器的可用内存数量通常比分配给桌面应用程序的少,但是这种内存限制问题不仅会影响给变量分配内存,同时还会影响调用栈以及在一个线程中能够同时执行的语句数量。

因此,确保占用最少的内存可以让页面获得更好的性能。优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据,一旦数据不再使用,通过将其值设置为null释放其引用,这种做法叫做解除引用,这一做法适合大多数全局变量和全局变量的属性,局部变量会在他们离开执行环境时自动被解除引用。

转载于:https://www.cnblogs.com/onlycare/p/9791873.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring官方网站

https://docs.spring.io/spring/docs/current/spring-framework-reference/overview.html#overview

vue从入门到精通之进阶篇(三)axios

基本使用 Axios.method(url,[,..data],options) .then(function(res){ }) .catch(function(err) { } ) 合并请求 this.$axios.all([请求1,请求2]) .then( this.$axios.spread(function(res1,res2){ }) ) 拦截器 单请求配置options: axios.post(url,data,options); 全局配…

使用CSS实现图片未加载完成时占位显示

通过css控制,可以实现加载网络图片时,未加载完成的时候显示本地一张占位图,加载完成后显示网络图片; 原理:通过在img标签的after伪元素上添加一张占位图,并且img都设置为position:relative;after设置positi…

数学符号历史

https://baike.baidu.com/item/%E6%95%B0%E5%AD%A6%E7%AC%A6%E5%8F%B7/685756?fraladdin

POJ2828 Buy Ticket

传送门 题目大意:给一段空序列,每次向序列中某一个位置插入一个数,插入的位置后面所有数相应后移。 这个题比较令人头疼的是后移操作,我们不可能大面积后移。那怎么办呢?后面的人对前面有影响,那我们能不能…

vue从入门到精通之进阶篇(四)模块化工具 webpack

模块化 webpack命令 npm init -y npm install webpack3.6.0 --save-dev --registry https://registry.npm.taobao.orgpackage.json文件 "scripts": { "test": "webpack ./main.js ./build.js" },命令行运行 npm run test ES6模块 导入和导出只…

微观经济学

chapter1 导论 学经济学有啥用?找工作有用吗?没有用,但是当你失业的时候你就知道为什么了。为什么会有经济学?资源的稀缺性导致的问题! 1.1.稀缺性 既定的资源无法满足人们的欲望。稀缺性存在于任何地方,产…

树结构

https://baike.baidu.com/item/%E6%A0%91%E7%BB%93%E6%9E%84/3399688?fraladdin

C#事务提交

using (System.Transactions.TransactionScope transcope new System.Transactions.TransactionScope()) { //code something transcope.Complete(); }转载于:https://www.cnblogs.com/WuHZ/p/9797373.html

vue从入门到精通之进阶篇(五)脚手架vue-cli

vue-cli2.x脚手架的使用 参考链接&#xff1a;https://github.com/vuejs/vue-cli/tree/v2#vue-cli-- 安装&#xff1a; npm install -g vue-cli用法&#xff1a; $ vue init < template-name > < project-name >例&#xff1a; $ vue init webpack my-projec…

ES6 数值的扩展

ES6 规范了二进制和八进制的表示方法&#xff0c;代码如下&#xff1a; console.log(0o2000 1024) //true 使用0o表示八进制 0是数字0 o是小写字母oconsole.log(0b10000000000 1024) //true 使用0b表示二进制 0是数字…

树的定义

https://www.cnblogs.com/jpfss/p/10842521.html

【Java】 剑指offer(27) 二叉树的镜像

本文参考自《剑指offer》一书&#xff0c;代码采用Java语言。 更多&#xff1a;《剑指Offer》Java实现合集 题目  请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。 思路 画图可以很清晰地得到思路&#xff1a;先前序遍历&#xff0c;对每个结点交…

vue从入门到精通之进阶篇(一)vue-router:导航守卫

vue-router的导航守卫之在导航完成后获取数据 需求&#xff1a;在导航完成之后加载数据。渲染DOM <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title> </head> <body><di…

Unity 新手入门 如何理解协程 IEnumerator yield

Unity 新手入门 如何理解协程 IEnumerator 本文包含两个部分&#xff0c;前半部分是通俗解释一下Unity中的协程&#xff0c;后半部分讲讲C#的IEnumerator迭代器 协程是什么&#xff0c;能干什么&#xff1f; 为了能通俗的解释&#xff0c;我们先用一个简单的例子来看看协程可以…

百万级数据库优化方案

一、百万级数据库优化方案 1.对查询进行优化&#xff0c;要尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#…

vue从入门到精通之进阶篇(二)组件通信:兄弟组件通信

$emit和$on进行组件之间的传值 注意&#xff1a;emit和emit和emit和on的事件必须在一个公共的实例上&#xff0c;才能够触发 需求&#xff1a; ​ 1.有A&#xff0c;B&#xff0c;C三个组件&#xff0c;同时挂载到入口组件中 ​ 2.将A组件中的数据传递到C组件&#xff0c;再将…

树结构的性质

非空树的结点总数等于树种所有结点的度之和加 1度为 K 的非空树的第 i 层最多有 ki-1 个结点(i > 1)深度为 h 的 k 叉树最多有(kh - 1)/(k - 1)个结点具有 n 个结点的 k 叉树的最小深度为 logk(n(k-1)1))

EM算法 小结

猴子吃果冻 博客园首页新随笔联系管理订阅随笔- 35 文章- 0 评论- 3 4-EM算法原理及利用EM求解GMM参数过程 1.极大似然估计 原理&#xff1a;假设在一个罐子中放着许多白球和黑球&#xff0c;并假定已经知道两种球的数目之比为1:3但是不知道那种颜色的球多。如果用放回抽样方…

Vue UI 框架对比 element VS iview

element VS iview (最近项目UI框架在选型 &#xff0c;做了个分析&#xff0c; 不带有任何利益相关&#xff09; 主要从以下几个方面来做对比 使用率&#xff08;npm 平均下载频率&#xff0c;组件数量&#xff0c;star, issue…) API风格 打包优化 与设计师友好性 1&a…