JS内存泄漏是什么 什么情况下会出现内存泄漏 内存泄漏怎么解决

简介: JS内存泄漏是什么 什么情况下会出现内存泄漏 内存泄漏怎么解决

       js内存泄漏:在js内存中 有一个内存垃圾回收机制: 垃圾回收期会定期扫描内存,当内存中某个值被设置为0就会将其进行回收。而这个设置为0是什么设置为0呢。

               这里的设置为0指的是 例如我有两段代码


   第一段:没有内存泄漏

     let num = 0 
                 function change(){
                        let my_num = 123 定义一个没有被引用的变量 也就是说这个变量没有被其他变量所引用/使用  只是单纯的定义了一个数值变量并且没有使用
                        num = 300
                }
                        change() 调用这个函数

     第二段: 有内存泄漏

      let num = 100
                      function change(){
                                let my_num = 200 定义一个局部变量
                                num = my_num 局部变量被外部变量引用
                        }
                        change()


          通过上边两段代码解释一下js的垃圾回收机制  js的垃圾回收机制一共分为两种 分别是标记清除和引用计数      


               标记清除 当变量进入环境时(例如,在函数中声明一个变量),将这个变量标记为“进入环境”。当变量离开环境时(变量不参与运行),则将其标记为“离开环境”。标记“离开环境”的就回收内存。


               引用计数 就是 每当我们调用了这个函数后 这个函数内部每声明一个变量都会这个变量添加一个值为0的引用次数 上边也提到了垃圾回收机制中 会每过一段时间都会对内存进行扫描 当变量的引用次数为0时 就会把这个变量进行清除回收 而这个引用次数 则是每被引用一次 则这个引用次数+1  当引用的变量清除后 则-1 当被回收机制检测为0时则清除


       内存泄漏的几种情况:


                       1. 闭包中未释放的变量


                       2. 没有被清除的定时器


                       3. 意外的全局变量 : 例如在一个函数中给window对象上挂载一个变量 而window对象指向全局                        


                       4. 给DOM对象添加的属性是一个对象的引用 例如


                               let obj = {...}  let  document.querySelector('.idname').property = obj  如果DOM不消除 则 这个obj会一直存在 造成内存泄漏  ( 这里的DOM元素的property属性是DOM元素自带的属性  html自带的dom属性会自动转换成property)


                       5.  DOM对象和js对象互相引用

function testObject(element) { 
this.elementReference = element;    // 为testObject(js)对象的属性绑定element(DOM)对象
element.property = this;      // 为element(DOM)对象的属性绑定testObject(js)对象
} 
new testObject(document.getElementById('idname'));

                   4和5的    解决方案 :在window.onunload事件中写入下边的代码 document.getElementById('idname').property = null; 将DOM元素的property属性设置为空


                       6. 反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)


                       例如 一个 for循环  for(let i = 0 ; i < 5000; i ++){ hostElement.text = ' asdfgadsf ' }

相关文章
|
15小时前
|
存储 缓存 Java
优化Java代码中的内存使用:使用WeakHashMap解决内存泄漏问题
在Java应用程序中,内存泄漏是一个常见的问题,尤其是在处理大量对象时。本文将介绍如何使用WeakHashMap数据结构来解决内存泄漏问题,通过示例代码演示其在实际项目中的应用,从而提高Java代码的性能和可靠性。
|
15小时前
|
存储 缓存 JavaScript
请描述一种JavaScript内存泄漏的情况,并说明如何避免这种情况的发生。
JavaScript内存泄漏常由闭包引起,导致无用对象滞留内存,影响性能。例如,当一个函数返回访问大型对象的闭包,即使函数执行完,对象仍被闭包引用,无法被垃圾回收。防止泄漏需及时解除引用,注意事件监听器清理,使用WeakMap或WeakSet,定期清理缓存,以及利用性能分析工具检测。
13 2
|
15小时前
|
缓存 自然语言处理 JavaScript
JavaScript内存泄漏导致应用性能下降,常见于闭包使用不当
【5月更文挑战第14天】JavaScript内存泄漏导致应用性能下降,常见于闭包使用不当。闭包能记住并访问词法作用域,若函数返回后,其引用的对象未被释放,就会引发泄漏。例如,`createLeakyFunction`创建的闭包保留了对大型对象`someLargeObject`的引用,即使函数执行完毕,对象也无法被垃圾回收。避免泄漏的方法包括及时解除引用、清除事件监听器、使用WeakMap和WeakSet以及定期清理缓存。使用性能分析工具可检测和修复内存泄漏问题。
11 3
|
15小时前
|
JavaScript 前端开发 算法
JavaScript的垃圾回收机制通过标记-清除算法自动管理内存
【5月更文挑战第11天】JavaScript的垃圾回收机制通过标记-清除算法自动管理内存,免除开发者处理内存泄漏问题。它从根对象开始遍历,标记活动对象,未标记的对象被视为垃圾并释放内存。优化技术包括分代收集和增量收集,以提升性能。然而,开发者仍需谨慎处理全局变量、闭包、定时器和DOM引用,防止内存泄漏,保证程序稳定性和性能。
12 0
|
15小时前
|
监控 Java 测试技术
JVM工作原理与实战(二十八):内存溢出和内存泄漏
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了内存溢出与内存泄漏、内存泄漏的常见场景、解决内存溢出的步骤等内容。
11 0
JVM工作原理与实战(二十八):内存溢出和内存泄漏
|
15小时前
|
存储 缓存 JavaScript
【Web 前端】JS哪些操作会造成内存泄露?
【4月更文挑战第22天】【Web 前端】JS哪些操作会造成内存泄露?
|
15小时前
|
JavaScript 前端开发
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 内存溢出问题
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 内存溢出问题
19 1
|
15小时前
|
存储 缓存 监控
Java内存管理:垃圾回收与内存泄漏
【4月更文挑战第16天】本文探讨了Java的内存管理机制,重点在于垃圾回收和内存泄漏。垃圾回收通过标记-清除过程回收无用对象,Java提供了多种GC类型,如Serial、Parallel、CMS和G1。内存泄漏导致内存无法释放,常见原因包括静态集合、监听器、内部类、未关闭资源和缓存。内存泄漏影响性能,可能导致应用崩溃。避免内存泄漏的策略包括代码审查、使用分析工具、合理设计和及时释放资源。理解这些原理对开发高性能Java应用至关重要。
|
15小时前
|
JavaScript 前端开发 Java
JavaScript中的内存泄露:如何避免及修复
JavaScript中的内存泄露:如何避免及修复
33 3
|
15小时前
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
36 5