首页 > 系统相关 >垃圾回收与内存泄漏

垃圾回收与内存泄漏

时间:2022-11-02 09:45:39浏览次数:31  
标签:泄漏 垃圾 变量 函数 回收 引用 内存

一、浏览器的垃圾回收机制

1.垃圾回收的概念
  • JavaScript代码运行时,需要分配内存空间来储存变量和值。当变量不在参与运行时,就需要系统收回被占用的内存空间,这就是垃圾回收。
2.垃圾回收的机制
  • Javascript 具有自动垃圾回收机制,会定期对那些不再使用的变量、对象所占用的内存进行释放,原理就是找到不再使用的变量,然后释放掉其占用的内存。
  • JavaScript中存在两种变量:局部变量和全局变量。全局变量的生命周期会持续要页面卸载;而局部变量声明在函数中,它的生命周期从函数执行开始,直到函数执行结束,在这个过程中,局部变量会在堆或栈中存储它们的值,当函数执行结束后,这些局部变量不再被使用,它们所占有的空间就会被释放。
  • 当局部变量被外部函数使用时,其中一种情况就是闭包,在函数执行结束后,函数外部的变量依然指向函数内部的局部变量,此时局部变量依然在被使用,所以不会回收。
3.垃圾回收的方式
  • 浏览器通常使用的垃圾回收方法有两种:标记清除引用计数
    • 标记清除
      • 标记清除是浏览器常见的垃圾回收方式,当变量进入执行环境时,就标记这个变量“进入环境”,被标记为“进入环境”的变量是不能被回收的,因为他们正在被使用。当变量离开环境时,就会被标记为“离开环境”,被标记为“离开环境”的变量会被内存释放。
      • 垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后。垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。
    • 引用计数
      • 另外一种垃圾回收机制就是引用计数,这个用的相对较少。引用计数就是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变为0时,说明这个变量已经没有价值,因此,在在机回收期下次再运行时,这个变量所占有的内存空间就会被释放出来。
      • 这种方法会引起循环引用的问题:例如: obj1和obj2通过属性进行相互引用,两个对象的引用次数都是2。当使用循环计数时,由于函数执行完后,两个对象都离开作用域,函数执行结束,obj1和obj2还将会继续存在,因此它们的引用次数永远不会是0,就会引起循环引用。
4.减少垃圾回收的方法
  • 虽然浏览器可以进行垃圾自动回收,但是当代码比较复杂时,垃圾回收所带来的代价比较大,所以应该尽量减少垃圾回收
  • 对数组进行优化
    • 在清空一个数组时,最简单的方法就是给其赋值为[ ],但是与此同时会创建一个新的空对象,可以将数组的长度设置为0,以此来达到清空数组的目的。
  • 对object进行优化
    • 对象尽量复用,对于不再使用的对象,就将其设置为null,尽快被回收。
  • 对函数进行优化
    • 在循环中的函数表达式,如果可以复用,尽量放在函数的外面。

二、导致内存泄漏的情况

  • 内存泄漏:无法垃圾回收就是内存泄露
  • 可能情况如下:
    • 意外的全局变量
      • 由于使用未声明的变量,而意外的创建了一个全局变量,而使这个变量一直留在内存中无法被回收。
    • 被遗忘的计时器或回调函数
      • 设置了 setInterval 定时器,而忘记取消它,如果循环函数有对外部变量的引用的话,那么这个变量会被一直留在内存中,而无法被回收。
    • 脱离 DOM 的引用
      • 获取一个 DOM 元素的引用,而后面这个元素被删除,由于一直保留了对这个元素的引用,所以它也无法被回收。
    • 闭包
      • 不合理的使用闭包,从而导致某些变量一直被留在内存当中。

标签:泄漏,垃圾,变量,函数,回收,引用,内存
From: https://www.cnblogs.com/P1Kaj1uu/p/16849982.html

相关文章

  • 内存高【8】
    windbg分析1.真的是非托管泄漏吗?我在很多分析内存泄漏方面的文章都提到过,先要用二分法确定下是哪一部分的内存泄漏(托管还是非托管)。0:000>!address-summary---U......
  • 内存高【7】
    windbg分析1.托管还是非托管?既然是内存暴涨,那就看看当前进程的commit内存有多大?0:000>!address-summary---StateSummary----------------RgnCount-------......
  • 【Java编程思想读书笔记】第五章:垃圾回收机制
    参考书目:《Java编程思想》(第四版)友链:​​【读书笔记】Java重要知识点整理与汇总​​阅读《Java编程思想》(第四版)一书收获颇多,之所以想通过用博客记笔记的方式来读书,是因为......
  • 嵌入式-C语言基础:malloc动态开辟内存空间
    #include<stdio.h>#include<stdlib.h>intmain(){//char*p;//定义一个野指针:没有让它指向一个变量的地址//*p='c';//直接对野指针进行操作,会报错ch......
  • 倒垃圾
    有关CSP-S。T1挂了。T2人均切。T3没看。T4暴力还挂了5分,不知道能不能水过subtask。没上200,失败。虽然要是T1没挂我还能260,但是挂了。算了,菜就是菜。然后现在还是每天挂......
  • c++从入门到精通——const分配内存模型
    const分配内存模型对const变量取地址,分配临时内存#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingnamespacestd;voidtest(){constinta=10;int*p=(i......
  • 如何写成高性能的代码(三):巧用稀疏矩阵节省内存占用
    稀疏矩阵的概念一个m×n的矩阵是一个由m行n列元素排列成的矩形阵列。矩阵里的元素可以是数字、符号及其他的类型的元素。一般来说,在矩阵中,若数值为0的元素数目远远多于非0......
  • C语言从入门到精通——字符串和内存
    求非空字符串元素个数:“nichoushachounizadi”字符串逆置:str_inversehello--ollehvoidstr_inserse(char*str){char*start=str;//记录首元素地址char*en......
  • 买条新内存给台式机扩容,没想到出现玄学花屏
    背景我目前的配置是i5-8400,16G内存(两条威刚8G2400)然后在日常使用中,16G内存已经捉襟见肘了,无论是Android开发还是后端开发,每次编译都卡得很正好双十一,就想着买条16G内......
  • 如何写成高性能的代码(三):巧用稀疏矩阵节省内存占用
    稀疏矩阵的概念一个m×n的矩阵是一个由m行n列元素排列成的矩形阵列。矩阵里的元素可以是数字、符号及其他的类型的元素。一般来说,在矩阵中,若数值为0的元素数目远远多于非......