Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。

JS中最常见的垃圾回收方式是标记清除。

工作原理:是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。

工作流程:

  1. 垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记。

  2. 去掉环境中的变量以及被环境中的变量引用的变量的标记。

  3. 再被加上标记的会被视为准备删除的变量。

  4. 垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。

引用计数 方式

工作原理:跟踪记录每个值被引用的次数。

工作流程:

  1. 声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值的引用次数就是1。

  2. 同一个值又被赋值给另一个变量,这个引用类型值的引用次数加1.

  3. 当包含这个引用类型值的变量又被赋值成另一个值了,那么这个引用类型值的引用次数减1.

  4. 当引用次数变成0时,说明没办法访问这个值了。

  5. 当垃圾收集器下一次运行时,它就会释放引用次数是0的值所占的内存。

但是循环引用的时候就会释放不掉内存。循环引用就是对象A中包含另一个指向对象B的指针,B中也包含一个指向A的引用。

因为IE中的BOM、DOM的实现使用了COM,而COM对象使用的垃圾收集机制是引用计数策略。所以会存在循环引用的问题。

解决:手工断开js对象和DOM之间的链接。赋值为null。IE9把DOM和BOM转换成真正的JS对象了,所以避免了这个问题。

什么情况会引起内存泄漏? 虽然有垃圾回收机制但是我们编写代码操作不当还是会造成内存泄漏。

  1. 意外的全局变量引起的内存泄漏。

原因:全局变量,不会被回收。

解决:使用严格模式避免。

  1. 闭包引起的内存泄漏

原因:闭包可以维持函数内局部变量,使其得不到释放。

解决:将事件处理函数定义在外部,解除闭包,或者在定义事件处理函数的外部函数中,删除对dom的引用。

  1. 没有清理的DOM元素引用

原因:虽然别的地方删除了,但是对象中还存在对dom的引用

解决:手动删除。

  1. 被遗忘的定时器或者回调

原因:定时器中有dom的引用,即使dom删除了,但是定时器还在,所以内存中还是有这个dom。

解决:手动删除定时器和dom。

  1. 子元素存在引用引起的内存泄漏

原因:div中的ul li 得到这个div,会间接引用某个得到的li,那么此时因为div间接引用li,即使li被清空,也还是在内存中,并且只要li不被删除,他的父元素都不会被删除。

解决:手动删除清空。

什么放在内存中?什么不放在内存中? 基本类型是:Undefined/Null/Boolean/Number/String

基本类型的值存在内存中,被保存在栈内存中。从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本。

引用类型:object

引用类型的值是对象,保存在堆内存中。

  1. 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象。

  2. js不允许直接访问内存中的位置,也就是不能直接访问操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。

栈和堆的区别

一、堆栈空间分配区别:

1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

2、堆(操作系统): 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

二、堆栈缓存方式区别:

1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;

2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

三、堆栈数据结构区别:

堆(数据结构):堆可以被看成是一棵树,如:堆排序;

栈(数据结构):一种先进后出的数据结构。

转载于:https://juejin.im/post/5b8fd6b1f265da0aa74f01c7

js垃圾回收机制和引起内存泄漏的操作相关推荐

  1. 面试题——js垃圾回收机制和引起内存泄漏的操作

    JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理:是当变量进入环境时,将这个变量标记为"进 ...

  2. 为什么JAVA的垃圾回收机制无法避免内存泄漏

    一.本文参考: 1.<深入理解java虚拟机 JVM高级特性与最佳实践> 2.http://coderevisited.com/memory-leaks-in-java/ 二.对象已死的判 ...

  3. js垃圾回收机制,内存泄露和内存溢出,解决闭包产生的内存泄露详解

    一.内存的周期和回收机制 分配内存----->使用内存----->释放内存 1.JS 环境中分配的内存有如下声明周期: 内存分配:当我们声明变量.函数.对象的时候,系统会自动为他们分配内存 ...

  4. 前端面试常考题:JS垃圾回收机制

    摘要:众所周知,应用程序在运行过程中需要占用一定的内存空间,且在运行过后就必须将不再用到的内存释放掉,否则就会出现下图中内存的占用持续升高的情况,一方面会影响程序的运行速度,另一方面严重的话则会导致整 ...

  5. js垃圾回收机制(Gc)

    js垃圾收机制(Gc) 1.GC(garbage collection):js具有自动垃圾回收机制,即执行环境会负责管理代码执行过程中使用的内存, 2.GC会定期(周期性)找出那些不再继续使用的变量, ...

  6. js垃圾回收机制详解

    简介 一.前言 二.什么是内存泄漏 1. 引用计数 2. 标记清除 三.总结 一.前言 大家好,我是思航.最近我们游戏在进行内存优化,所以大家网上找了很多教程,来定位和查找内存泄漏问题.今天呢,我打算 ...

  7. JS 垃圾回收机制解析

    概述 JS是一门具有自动垃圾回收机制的语言,开发人员不必关心内存分配和回收问题. JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的 ...

  8. JS 垃圾回收机制以及垃圾回收策略

    垃圾回收机制 什么是垃圾回收机制: 解释:执行环境负责管理代码执行过程中使用的内存.JS的垃圾回收机制是为了以防内存泄漏,简单来说就是:间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存. ...

  9. JS垃圾回收机制是怎样的?

    1.概述 js的垃圾回收机制是为了防止内存泄漏(已经不需要的某一块内存还一直存在着),垃圾回收机制就是不停歇的寻找这些不再使用的变量,并且释放掉它所指向的内存. 在JS中,JS的执行环境会负责管理代码 ...

最新文章

  1. 3.1.3 awk命令用法
  2. Maple Warrior 个人简历
  3. 操作系统之银行家算法—详解流程及案例数据
  4. 【干货】精通网红OSPF协议---进阶篇
  5. 嵌入式linux系统移植的四大步骤_嵌入式系统移植步骤
  6. c++ std 方法 取两个数的较大_【数据结构C++】两数交换(4种方法)
  7. STM32之输入捕获
  8. 让软件自己写软件,英特尔的机器编程会取代程序员吗?
  9. 移动开发者Windows装机必备工具
  10. Unable to connect to the server: x509: certificate is valid for问题解决
  11. Springboot版本的WebSocket向app端推送消息实现
  12. 最in [IN词] 分享
  13. 【免费资源必备】LingoDeer,扫描全能王直装版等五款APP让你享受上千个免费资源
  14. java计算机毕业设计在线辅导答疑系统源码+mysql数据库+系统+lw文档+部署
  15. html word-break,HTML Style wordBreak用法及代码示例
  16. Python Level 4 程序题:输入两个整数,倒序输出
  17. linux reg 指令,LINUX的一些小命令
  18. 串口---UART RS232 RS485 TTL
  19. python代码编写工具_编写更好的Python代码的终极指南
  20. “爱因斯坦的超级问题:谁养鱼?”

热门文章

  1. bootstrap之 formgroup表单布局样式
  2. converter 迁移xen server 上的虚拟机 到 wmware esxi
  3. 我也来说一下SilverLight3的ChildWindow--带Logo的标题
  4. TensorFlow 官方文档中文版发布啦(持续维护)
  5. GitHub引入联合提交者功能
  6. 常用的Git Tips
  7. 对复杂业务组件在实际开发过程中被调用的反思
  8. mysql存储过程-汇总学习
  9. linux 死锁介绍与简单分析
  10. 用户头像设置之ios版本