本文转载自微信公众号「Android开发编程」,作者Android开发编程。转载本文请联系Android开发编程公众号。
创新互联-专业网站定制、快速模板网站建设、高性价比亭湖网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式亭湖网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖亭湖地区。费用合理售后完善,十多年实体公司更值得信赖。
JS自带一套内存管理引擎,负责创建对象、销毁对象,以及垃圾回收。
我们来探讨一下垃圾回收机制和内存泄露;
1、什么是js的回收机制
2、标记清除(主流浏览器做法)
标记和扫描算法经过:
3、引用计数(IE9以下)
含义是跟踪记录所有值被引用的次数;
例如变量a赋值后,这个值的引用次数为1,这个a值又被赋值给另一个变量b,这时引用次数+1;但当b赋另外的值,引用次数-1;当值的引用书为0,说明没有办法再访问这个值,这时就可以将内存回收了。
IE9以下还在使用引用计数,当对象循环引用时,引用次数无法标记为0,就会导致无法被回收。其他浏览器废弃使用;
下面的代码
- var o1 = {
- o2: {
- x: 1
- }
- };
- // 两个对象被创建。
- // ‘o1’对象引用‘o2’对象作为其属性。
- // 不可以被垃圾收集
- var o3 = o1; // ‘o3’变量是第二个引用‘o1‘指向的对象的变量.
- o1 = 1; // 现在,在‘o1’中的对象只有一个引用,由‘o3’变量表示
- var o4 = o3.o2; // 对象的‘o2’属性的引用.
- // 此对象现在有两个引用:一个作为属性、另一个作为’o4‘变量
- o3 = '374'; // 原来在“o1”中的对象现在为零,对它的引用可以垃圾收集。
- // 但是,它的‘o2’属性存在,由‘o4’变量引用,因此不能被释放。
- o4 = null; // ‘o1’中最初对象的‘o2’属性对它的引用为零。它可以被垃圾收集。
内存泄漏是应用程序过去使用,但不再需要的尚未返回到操作系统或可用内存池的内存片段。由于没有被释放而导致的,它将可能引起程序的卡顿和崩溃;
1、意外的全局变量
- function foo(arg) {
- bar = "test";
- // window.bar = "test";
- }
js对未声明变量会在全局最高对象上创建它的引用,(是以属性存在的,而不是变量),如果在游览器上就是window对象,如果在node环境下就是global;如果未声明的变量缓存大量的数据,它可能只有在页面被刷新或者被关闭的时候才会释放内存,这样就造成了内存意外泄漏;
2、被忘记的定时器或者回调函数
我们以经常在 JavaScript 中使用的 setInterval 为例;
- var serverData = loadData();
- setInterval(function() {
- var renderer = document.getElementById('renderer');
- if(renderer) {
- renderer.innerHTML = JSON.stringify(serverData);
- }
- }, 5000); //每5秒执行一次.
3、闭包
- function my(name) {
- function sendName() {
- console.log(name)
- }
- return sendName
- }
- var test=my("test")
- test() //test
在my()内部创建的sendName()函数是不会被回收的,因为它被全局变量test引用,处于随时被调用的状态。如果向释放内存可以设置test=null;由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过度使用闭包可能会导致内存占用过多
4、DOM泄漏
- var elements = {
- button: document.getElementById('button'),
- image: document.getElementById('image')
- };
- function doStuff() {
- elements.image.src = 'http://test.png';
- }
- function removeImage() {
- // image 元素是body的直接子元素。
- document.body.removeChild(document.getElementById('image'));
- // 我们仍然可以在全局元素对象中引用button。换句话说,button元素仍在内存中,无法由GC收集
- }
GC机制是自动完成的,但我们可以强制启动它,或是关闭它;
我们在开发中要注意内存泄露问题,不然会出现意想不到的情况;
一起学习加油;
分享标题:前端进阶之深入了解JS垃圾回收机制和内存泄漏
网站URL:http://www.shufengxianlan.com/qtweb/news47/274397.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联