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 ' }

相关文章
|
13天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
13天前
|
JavaScript 前端开发 Java
避免 JavaScript 中的内存泄漏
【10月更文挑战第30天】避免JavaScript中的内存泄漏问题需要开发者对变量引用、事件监听器管理、DOM元素操作以及异步操作等方面有深入的理解和注意。通过遵循良好的编程实践和及时清理不再使用的资源,可以有效地减少内存泄漏的风险,提高JavaScript应用程序的性能和稳定性。
|
26天前
|
存储 JavaScript 前端开发
JS 中的内存管理
【10月更文挑战第17天】了解和掌握 JavaScript 中的内存管理是非常重要的。通过合理的内存分配、及时的垃圾回收以及避免内存泄漏等措施,可以确保代码的高效运行和稳定性。同时,不断关注内存管理的最新发展动态,以便更好地应对各种挑战。在实际开发中要时刻关注内存使用情况,以提升应用的性能和质量。
26 1
|
9天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
30 6
|
18天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
127 9
|
18天前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
34 6
|
18天前
|
JavaScript 前端开发 Java
JavaScript 中内存泄漏的几种常见情况
【10月更文挑战第25天】实际上还有许多其他的情况可能导致内存泄漏。为了避免内存泄漏,我们需要在开发过程中注意及时清理不再需要的资源,合理使用内存,并且定期检查内存使用情况,以确保程序的性能和稳定性
28 2
|
21天前
|
存储 JavaScript 前端开发
js 中有哪几种内存泄露的情况
JavaScript 中常见的内存泄漏情况包括:1) 全局变量未被释放;2) 意外的全局变量引用;3) 被遗忘的计时器或回调函数;4) 事件监听器未被移除;5) 子元素存在时删除父元素;6) 循环引用。
|
6月前
|
前端开发 JavaScript 算法
JavaScript 内存管理的秘密武器:垃圾回收(下)
JavaScript 内存管理的秘密武器:垃圾回收(下)
JavaScript 内存管理的秘密武器:垃圾回收(下)
|
6月前
|
前端开发 JavaScript 算法
JavaScript 内存管理的秘密武器:垃圾回收(上)
JavaScript 内存管理的秘密武器:垃圾回收(上)
JavaScript 内存管理的秘密武器:垃圾回收(上)