JS 垃圾回收与性能优化 傷城~ 2022-12-25 00:58 133阅读 0赞 JavaScript 通过自动内存管理实现内存分配和闲置资源回收,基本思路:确定哪个变量不会再使用,然后释放它占用的内存。这个过程是周期性的,即垃圾回收程序每隔一定时间就会自动运行。但是某块内是否还有用,属于“不可判断的”问题,意味着靠算法是解决不了的 ## 垃圾回收方法 ## ### 标记清理 ### JavaScript 最常用的垃圾回收策略是标记清理(mark-and-sweep)。当变量进入环境时就将其标记为`进入环境`,当变量离开环境时将其标记为`离开环境`。随后每隔一段时间就会检测一下当前作用域中的内存,是否被占用,如果没有被占用,在空闲的时候就将其释放掉 ### 引用计数 ### 思路是对每个值都记录它被引用的次数。当一个空间地址被占用一次,引用数 +1,如果不占用,就引用数 -1。当一个值引用数为 0时,说明已经没有被占用了,在空闲的时候就将其释放掉 function problem() { let o1 = new Object(); let o2 = new Object(); o1.A = o2; o2.B = o1; } o1 和 o2 相互引用,意味着它们引用数都是 2,当函数结束后, o1 和 o2 还会存在,如果函数调用多次,会导致大量内存永远不被释放 ### 手动进行内存释放 ### 在IE8及以前的IE版本中,并非所有对象都是原生 JavaScript 对象,BOM 和 DOM 中的对象是 C++ 实现的组件对象模型(COM),而 COM 对象使用引用计数实现垃圾回收 let el = document.getElementById("div"); let o = new Object(); o.el = el; el.obj = o; 由于存在循环引用,因此 DOM 元素内存永远不会被回收,需要将变量设置为 null (解除引用),切断变量与其引用值之间的关系 o.el = null; el.obj = null; IE9 把 BOM 和 DOM 对象都改成了 JavaScript 对象,也避免了存在两套垃圾回收算法而导致的问题 ## 提升性能 ## ### const 和 let 提升性能 ### let 和 const 都以块(而非函数)为作用域,使用这两个关键字能更早让垃圾回收程序介入 ### 隐藏类和删除操作 ### 避免“先创建再补充” 式的动态属性赋值。在构造函数中一次声明所有属性。这样,两个实例基本就一样了,因此可以共享一个隐藏类,从而带来潜在的性能提升 * 动态删除属性与动态添加属性导致后果一样,最好的方法时把不想要的属性设置为 null,这样可以保持隐藏类不变和继续共享,同时也能达到删除引用值提供垃圾回收的效果 function Person(name) { this.age = 12; this.name = name; } let a1 = new Person(); let a2 = new Person("lion"); // 尽量不要这么做 // 此时 Person 实例就会有两个不同的隐藏类,根据操作频率和隐藏类的大小,可能对性能产生影响 a2.name = "lion" // 尽量不要这么做 delete a1.age; ### 避免内存泄露 ### **情况1:** 意外声明全局变量是最常见的内存泄露,解释器会把变量 name 当做 window 的属性来创建。在 window 对象上创建的属性,只要 window 本身不被清理就不会消失 function say() { name = "lion"; } 在全局作用域声明 arr(fn() 里没传形参arr;在函数里没有声明 arr),arr 在全局作用域中赋值 let arr = []; function fn() { arr = [1, 2, 3]; } fn(); **情况2:** 定时器也导致内存泄露,只要定时器一直运行,回调函数中引用的 name 就会一直占用内存 let name = "lion"; setInterval(() => { console.log(name); }, 100); **情况3:** 调用 out() 会导致分配给 name 的内存被泄露,执行的时候创建一个内部闭包,只要返回的函数存在就不能清理 name,因为闭包一直在引用着它 let out = function () { let name = "lion"; return function () { return name; }; }; ## 总结 ## 解除变量的引用不仅可以减少消除循环引用,而且对垃圾回收也有帮助。为促进内存回收,全局对象、全局对象的属性和循环引用都应该在不需要时解除引用
相关 性能优化:Java垃圾回收算法影响分析 Java的垃圾回收机制是其性能优化的重要组成部分。以下是它对系统性能影响的一些分析: 1. **内存管理**:垃圾回收可以自动管理内存,避免因手动管理内存碎片而导致性能下降。 我会带着你远行/ 2024年09月20日 06:15/ 0 赞/ 4 阅读
相关 Java垃圾回收机制与优化实践 Java的垃圾回收机制是Java语言设计的一部分,其主要目的是自动管理内存中的对象,尤其是那些不再被引用的对象。 垃圾回收机制主要包括以下步骤: 1. 分配:当程序需要创建 浅浅的花香味﹌/ 2024年09月16日 19:48/ 0 赞/ 19 阅读
相关 Java性能优化问题:内存泄漏与垃圾回收详解 在Java编程中,内存泄漏和垃圾回收是两个关键的概念。下面我会分别详细解释它们。 1. **内存泄漏**: - 内存泄漏是指程序动态分配的内存在不再使用时没有释放,导致 心已赠人/ 2024年09月15日 14:36/ 0 赞/ 20 阅读
相关 Java性能优化:内存泄漏与垃圾回收示例 内存泄漏和垃圾回收是Java程序运行中的重要环节,它们直接影响程序的性能。 1. 内存泄漏: 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间。这会导致可用内存越 朴灿烈づ我的快乐病毒、/ 2024年09月14日 19:18/ 0 赞/ 39 阅读
相关 Java垃圾回收机制理解与优化 Java垃圾回收机制是Java语言设计的一部分,它负责自动管理内存空间,防止内存泄露。以下是对其理解和优化的一些关键点: 1. **基本概念**:理解新生代(年轻对象)和老年 待我称王封你为后i/ 2024年09月11日 13:21/ 0 赞/ 25 阅读
相关 Java性能优化:内存泄漏与垃圾回收机制 内存泄漏和垃圾回收机制是Java编程中经常遇到的两个重要概念。 1. 内存泄漏: 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,导致系统可用内存越来越少。长期积累的 た 入场券/ 2024年09月11日 05:39/ 0 赞/ 22 阅读
相关 JS 垃圾回收与性能优化 JavaScript 通过自动内存管理实现内存分配和闲置资源回收,基本思路:确定哪个变量不会再使用,然后释放它占用的内存。这个过程是周期性的,即垃圾回收程序每隔一定时间就会自动 傷城~/ 2022年12月25日 00:58/ 0 赞/ 134 阅读
相关 《.NET 性能优化》—第四章 垃圾回收 通过书本的阅读,看得我是云里雾里,不过大致把该章节过了一遍,仅仅记住了几个单词,“代”,大对象堆,固定。具体的描述也不是很明白,所以先从网络找一些资源,挑出能看懂的做一些笔记, 男娘i/ 2021年06月24日 16:11/ 0 赞/ 429 阅读
还没有评论,来说两句吧...