javascript 垃圾回收机制和内存管理
前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!
垃圾回收机制的原理是找到不再被使用的变量,然后释放其占用的内存,但这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定时间间隔周期性的执行。
变量的生命周期
JS 中有两种变量,全局变量和函数中的局部变量。局部变量的生命周期在函数执行完成后就结束了,此时就可以将他们的内存释放。全局变量的生命周期会持续到当前页面关闭。
管理内存
分配给 web 浏览器的可用内存数量通常要比分配给桌面应用程序少。这样做的目的主要是处于安全方面考虑,目的是防止运行 JS 的网页耗尽全部系统内存而导致系统崩溃。
因此,确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为 null 来释放其引用,这个方法叫做解除引用。这一做法适用于大多数的全局变量和全局对象的属性。局部变量会在他们离开执行环境时自动被解除引用。
解除一个值的引用并不意味着自动回收改值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。
标记清除
通常,垃圾收集器(garbage collector)在运行时候会给储存在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除的工作。
内存泄漏
JS 垃圾回收机制是为了防止内存泄漏。内存泄漏的含义就是当某些变量不需要存在时,并没有被回收,依然占用内存,从而越积越多,最终导致内存泄漏(可以理解为内存满了,溢出了)。
虽然有垃圾回收机制但是我们编写代码操作不当还是会造成内存泄漏。可能的原因有:
- 意外的全局变量引起的内存泄漏。原因:全局变量,不会被回收。解决办法:使用严格模式
- 闭包引起的内存泄漏。原因:闭包可以维持函数内局部变量,使其得不到释放。解决办法:将活动对象赋值为 null
- 没有清理的DOM元素引用。解决办法:手动删除 dom。
- 被遗忘的定时器或者回调。原因:定时器中有dom的引用,即使dom删除了,但是定时器还在,所以内存中还是有这个dom。解决办法:手动删除定时器和dom。
最新文章
- iis7.0与asp.net的运行原理
- redirect问题
- 重构MVC多条件+分页解决方案
- position:absolute绝对定位解读
- QT_BEGIN_NAMESPACE QT_END_NAMESPACE
- JavaScript严谨模式(Strict Mode)
- 【Java】hashcode()和equals()
- 查看服务器硬件配置信息(cpu/内存)
- centos复制到另外一台电脑连不上网
- bzoj 2623 所罗门的咒语
- 双向链表实现简单的list
- 强制修改mysql 中root的密码
- js模块编写
- 用Jenkins搭建自动构建服务
- 通过批处理进行Windows服务的安装/卸载&;启动/停止
- python 在WINDOS虚拟环境部署
- python中的os.path.dirname(__file__)的使用
- windows下使用gethostbyname函数报错无法解析的外部符号
- 基于Zynq平台的EtherCAT主站方案实现
- 切换svn登录账户
热门文章
- sqlserver 触发器实例
- STM32 + RT Thread OS 串口通讯
- Apache RocketMQ 的过去、现在和未来 原创: DataPipeline DataPipeline数见科技 前天
- <;JavaScript>;constructor、prototype、__proto__和原型链
- NTC热敏电阻温度计算方法,Steinhart-Hart方程和B值法(转)
- maven报错解决
- python下multiprocessing和gevent的组合使用
- 123457123457#0#-----com.yuming.TruckCarRun01--前拼后广--大卡车游戏cym
- [Vue warn]: Do not use built-in or reserved HTML elements as component id: content
- Java中将一个反斜杠转换成两个反斜杠