垃圾回收机制

垃圾收集器必须跟踪哪个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存,内存泄露和浏览器实现的垃圾回收机制息息相关, 而浏览器实现标识无用变量的策略主要有下两个方法:

引用计数

跟踪记录每个值被引用的次数。当声明一个变量并将引用类型的值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次 数加1.相反,如果包含对这个值引用的变量又取得另外一个值,则这个值的引用次数减1.当这个值的引用次数变成0时,则说明没有办法访问这个值了,因此就 可以将其占用的内存空间回收回来。

如: var a = {};     对象{}的引用计数为1b = a;          对象{}的引用计数为 1+1a = null;       对象{}的引用计数为2-1

所以这时对象{}不会被回收;

IE 6, 7 对DOM对象进行引用计数回收, 这样简单的垃圾回收机制,非常容易出现循环引用问题导致内存不能被回收, 进行导致内存泄露等问题, 如:

demo1:
var btn = $("button");
btn.onclick = function(){//当这里也可以访问到btn,说明function内部存在btn的引用
};demo2:function a () {var x = { };var y = {};x.a = y;y.a = x;
}
a();函数a执行完后,本来x, y对象都应该在垃圾回收阶段被回收, 可是由于存在循环引用,也不能被回收。

标记清除(mark-and-sweep)

到2008年为止,IE,Firefox,Opera,Chrome和Safari的javascript实现使用的都是标记清除式的垃圾收集策略(或类似的策略),只不过垃圾收集的时间间隔互有不同。

标记清除的算法分为两个阶段,标记(mark)和清除(sweep). 第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除

markFromRoots():worklist <- emptyfor each fld in Rootsref <- *fldif ref != null && isNotMarked(ref)  setMarked(ref)add(worklist,ref)mark()
mark():while not isEmpty(worklist)ref <- remove(worklist)  for each fld in Pointers(ref)  child <- *fldif child != null && isNotMarked(child)setMarked(child)add(worklist,child)sweep(start,end):scan <- startwhile scan < endif isMarked(scan)setUnMarked(scan)elsefree(scan)scan <- nextObject(scan)atomic collect():markFromRoots()sweep(HeapStart,HeapEnd)

转载于:https://www.cnblogs.com/mininice/p/3875437.html

浏览器的垃圾回收机制相关推荐

  1. 9.浏览器原理之浏览器垃圾回收机制

    目录 1.浏览器的垃圾回收机制 1)垃圾回收的概念 2)垃圾回收的方式 2.哪些操作会造成内存泄漏 1.浏览器的垃圾回收机制 1)垃圾回收的概念 垃圾回收:Javascript代码运行时,需要分配内存 ...

  2. 深入理解浏览器垃圾回收机制

    1. JavaScript 内存管理机制 计算机程序语言都运行在对应的代码引擎上,其使用内存过程可以分为以下三个步骤: 分配所需要的系统内存空间: 使用分配到的内存进行读或写等操作: 不需要使用内存时 ...

  3. 浏览器的垃圾回收及内存泄漏的情况

    通过 4 个问题,来了解浏览器垃圾回收的过程,后面会逐一解答: 浏览器怎么进行垃圾回收? 浏览器中不同类型变量的内存都是何时释放? 哪些情况会导致内存泄露?如何避免? weakMap weakSet ...

  4. 从 4 个面试题了解「浏览器的垃圾回收」

    浏览器垃圾回收一直是前端面试常考的部分,我一直不太理解.最近深入学习了一下,争取一篇文章说清楚. 我们首先带着这 4 个问题,来了解浏览器垃圾回收的过程,后面会逐一解答: 浏览器怎么进行垃圾回收? 浏 ...

  5. 说一下浏览器垃圾回收机制?

    解题思路 得分点 栈垃圾回收.堆垃圾回收.新生区老生区.Scavenge算法.标记-清除算法.标记-整理算法.全停顿.增量标记 标准回答 浏览器垃圾回收机制根据数据的存储方式分为栈垃圾回收和堆垃圾回收 ...

  6. 浏览器(V8)的垃圾回收机制

    文章目录 内存管理 什么是浏览器中的垃圾? 常见的GC算法 一. 引用计数 二. 标记清除 三. 标记整理 V8内核 V8的垃圾回收策略 V8内存分配 新生代区域及算法 老生代区域及算法 内存管理 在 ...

  7. 谈谈垃圾回收机制方式及内存管理

    回收机制方式 1.定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存. 2.原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然 ...

  8. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  9. Node的垃圾回收机制与内存溢出捕获(上)

    Node的垃圾回收机制与内存溢出捕获 一.什么是Node的内存?   想必大家在用JavaScript开发的过程中,不太关心内存的管理,因为对于前端来说,浏览器的内存几乎不会出现用完的情况,因为所接触 ...

最新文章

  1. 记录一次简单、高效、无错误的linux上安装pytorch的过程
  2. Vivadoz中Block Memory Generator v8.3的使用方法(二)
  3. .net的字符串插值,格式化字符串
  4. python队列是线程安全的吗_python – 为什么我的多进程队列看起来不是线程安全的?...
  5. 程序员败给了一个厨子,读书无用论让我 必须送书了
  6. word打开wps文件乱码_word文档打开是乱码解决方法
  7. 深入理解深度学习中的激活函数
  8. 【五校联考2015 8.20】宝藏
  9. 线段树--暴力修改专题浅谈
  10. Pytorch介绍以及基本使用
  11. iView组件+Django实现前后端分离上传图片
  12. 最速降线求解的数学模型
  13. VUE使用JS-SDK实现微信分享好友功能(通过点击控件触发)
  14. 【PPic】基于Electron+Vue+iView的图床应用设计
  15. 基于C#实现的零食售卖管理系统,支持称重,扫码,打印,彩虹兔零食售卖系统
  16. 微信视频号直播如何做?(二)
  17. 人月神话笔记-外科手术队伍
  18. n个点坐标解三角形个数
  19. 计算机类SCI前三区期刊
  20. 新浪微博分享不显示分享的链接问题

热门文章

  1. Python爬虫开发:正则表达式re的使用
  2. 【Java面试题】正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
  3. CompletableFuture并行异步处理类使用示例
  4. windows杀死指定端口号
  5. MySQL日期及时间加减函数
  6. Java 如何将String转化为Int
  7. Java-使用JavaMail发送一封邮件给用户邮箱功能实现
  8. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)
  9. Qt动态库的链接问题
  10. linux下安装微信