文档章节

JavaScript 的垃圾回收与内存泄露

smalldragonluo
 smalldragonluo
发布于 2014/06/16 23:33
字数 769
阅读 1557
收藏 0
点赞 0
评论 0

    JavaScript采用垃圾自动回收机制,运行时环境会自动清理不再使用的内存,因此javascript无需像C++等语言一样手动释放无用内存。

    在这之前先说一下垃圾回收的两种方式:引用计数标记清除

    引用计数方式会为每个已分配内存单元设置计数器,当计数器减少到0的时候就意味着该单元无法再被引用,将会被清除。

    有一个问题是,当存在循环引用时,内存单元的计数器将永远不为0,内存的释放会比较复杂(需要使用到弱引用)。

obj.val = obj2;
obj2.val = obj;

 

    标记清除式维护一条链表,当变量进入scope时被加入这条链表,移出scope时被从链表剔除。当gc被激活时,首先为每个变量打上一个标记,然后清除存在于那条链表的变量的标记以及变量引用的成员的标记。最后,不再使用到的变量仍旧被gc标记着,将被释放,包括循环引用。

    如果一段不再使用的内存未得到回收,将导致内存泄露 它将一直占据着内存而无法被利用,可能造成系统运行缓慢,浏览器崩溃等问题。

    关于浏览器的javascript实现使用哪种回收机制,众说纷纭,感觉贵圈好乱。

    我google了一下,http://www.ibm.com/developerworks/web/library/wa-memleak/?S_TACT=105AGX52&S_CMP=cn-a-wa 提到IE以及火狐都使用引用计数的机制回收DOM对象, http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx 说JScript采用 nongenerational mark-and-sweep garbage collector(一种标记清除),还有资料提到现代浏览器都使用标记清除回收javascript垃圾。

    总结为,浏览器回收JavaScript内存采用标记清除,使用引用计数回收宿主对象(如Dom、Bom、ActiveX Object)。

    根据我在IE上做的测试,javascript对象间的循环引用不会引发内存泄露。

 

setInterval(function(){
    for(var i = 0; i < 100000; i++){
        var obj = {}, obj2 = {};
        obj.val = obj2;
        obj2.val = obj;
    }
}, 10);

 

    内存使用呈周期性变化,一直稳定,看来不用担心javascript对象的循环引用问题。

    既然Dom采用引用计数回收内存,那是否存在内存泄露问题?

 

var nodeHold = [],
                 interval = setInterval(function(){
                    for(var i = 0, length = 1000; i < length; i++){
                        var node = document.createElement("div"),
                            obj = {};
                        node.val = obj;
                        obj.val = node;
                        document.body.appendChild(node);
                        document.body.removeChild(node);
                    }
            }, 500);

 

    在IE7与IE8上,内存直线上升。

    与 http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx 所称一致,原因是javascript的垃圾回收管不了Dom对象,且Dom使用引用计数回收方式,导致循环引用无法回收。前提是Dom必须先加到文档树再删除(我猜测是为真正的Dom对象分配内存,而这不属于javascript)。

    要注意的是,IE9+并不存在循环引用导致Dom内存泄露问题,可能是微软做了优化,或者Dom的回收方式已经改变。

 

© 著作权归作者所有

共有 人打赏支持
smalldragonluo
粉丝 2
博文 9
码字总数 5320
作品 0
南岸
JavaScript内存管理(转)

摘抄一篇文章,写得非常好,出处在此 作为一门高级语言,JS并不像低级语言C/C++那样拥有对内存的完全掌控。JS中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收。...

Xtc丶
02/16
0
0
JavaScript 内存机制(前端同学进阶必备)

简介 每种编程语言都有它的内存管理机制,比如简单的C有低级的内存管理基元,像,。同样我们在学习JavaScript的时候,很有必要了解JavaScript的内存管理机制。 JavaScript的内存管理机制是:内...

梁音
06/01
0
0
Javascript 内存管理

简介 低级语言,比如C,有低级的内存管理基元,像malloc(),free()。另一方面,JavaScript的内存基元在变量(对象,字符串等等)创建时分配,然后在他们不再被使用时“自动”释放。后者被称为...

nerozhao
2015/06/14
0
0
JS高程中的垃圾回收机制与常见内存泄露的解决方法

前言 起因是因为想了解闭包的内存泄露机制,然后想起《js高级程序设计》中有关于垃圾回收机制的解析,之前没有很懂,过一年回头再看就懂了,写篇博客与大家分享一下。如果喜欢的话可以点波赞...

OBKoro1
07/09
0
0
nodejs的内存管理,垃圾回收机制

要点记录: 1、网页js、命令行工具,快进快出的,即时内存泄露,无内存管理必要! 2、服务器端nodejs和其他正规语言一样存在内存泄露。 3、nodejs基于谷歌v8js引擎,速度很快,垃圾回收也是由...

qingfeng哥
2014/05/28
0
0
V8 Design Elements(翻译)

最近开始学习V8 Javascript引擎,这篇文章是翻译官方文档的,解释了V8之所以快的主要原因等,原文请参见http://code.google.com/apis/v8/design.html。 V8是一个新的为了提高Javascript程序速...

Sub
2013/08/14
0
0
GNOME Shell 内存泄露问题已修复 将随下次更新释出

此前我们曾报道过 GNOME Shell 被发现存在内存泄露的问题,官方开发团队也已确认导致这个问题的原因。现在,GNOME 开发者表示已修复了该漏洞,并会在下次更新中释出修复的版本。 目前这些变更...

达尔文
04/24
0
1
Js内存回收 === 屠龙之术?

本文可以看做是之前那篇勇士斗恶龙之没那么复杂的Js闭包的后续篇,在思考闭包中内存的问题时,有了写此文的冲动. 学以致用,从实用的角度出发我们最需要关注的就是内存回收用什么用处?我们日常工...

顽Shi
2014/01/17
0
1
可视化分析js的内存分配与回收

之前写了一篇文章浏览器是怎么看闭包的,发现有些读者对js内存分配与回收懵懵懂懂,理解文章的配图有些困难,我想主要是因为配图省略了一些细节。今天专门写一篇关于js内存分配回收的文章,帮...

lucefer
2017/07/29
0
0
javascript 垃圾回收算法了解一下

我们通常理解的 javascript 垃圾回收机制都停留在表面,"会释放不被引用变量内存",最近在读《深入浅出node.js》的书,详细了解了下 v8 垃圾回收的算法,记录了一些学习笔记。 敲黑板:v8引擎...

程序员解决师
06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 配置 HTTP 超时设置

当宏,例如 RSS Macro 进行 HTTP 请求的时候,有可能因为请求的时间比较长,而导致超时。你可以通过设置系统参数来避免这个问题。 配置 HTTP 超时设置: 在屏幕的右上角单击 控制台按钮 ,然...

honeymose
10分钟前
0
0
我的第一篇博文

网络界的前辈们好。本人从接触网络到你现在也有4、5年的时间了,期间不断的通过网络学习,当然也没少看大牛们给的建议。 2011年的9月份,如愿以偿的上了“大学”,刚上大学就接触到了一门叫做...

yeahlife
24分钟前
0
0
第十四章NFS服务搭建与配置

14.1 NFS介绍 NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netap...

Linux学习笔记
30分钟前
0
0
双向认证-nginx

1、设置容器 docker run -it --name nginx-test2 -v /home/nginx:/apps -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 8183:80 -p 7443:443 -d nginx:stable 2、修改nginx配......

hotsmile
30分钟前
0
0
深入了解 Java 自动内存管理机制及性能优化

一图带你看完本文 一、运行时数据区域 首先来看看Java虚拟机所管理的内存包括哪些区域,就像我们要了解一个房子,我们得先知道这个房子大体构造。根据《Java虚拟机规范(Java SE 7 版)》的规...

Java大蜗牛
32分钟前
4
0
SpringBoot | 第六章:常用注解介绍及简单使用

前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志 配置等。这章节开始,开始总结一些关于springboot的综合开发的知识点。由于SpringBoot本身是基于Spring和SpringMvc...

oKong
33分钟前
7
0
云数据库架构演进与实践

如今,大型企业如金融企业和银行等,在下一代的微服务架构转型要求下,需要基础软件和数据平台能够实现原生的云化,以满足微服务架构的需求。 微服务,也就是一种面向服务的,有特定边界的松...

巨杉数据库
34分钟前
0
0
Linux系统梳理---系统搭建(一):jdk卸载与安装

1.去官网下载符合Linux版本的jdk,暂用jdk-8u171-linux-x64.rpm 2.登陆Linux,进入usr目录,创建java目录(方便管理,可以其他位置):mkdir java 3.上传下载的jdk包至Linux服务器,使用rz指令(sz f...

勤奋的蚂蚁
45分钟前
0
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

六库科技
47分钟前
0
0
JVM 堆内存设置 -Xmx -Xms

在Tomcat的启动参数里可以设置,如下 参数说明: -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xmx 此设置控制 Java 堆的最大大...

不开心的时候不要学习
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部