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

相关文章
|
2月前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
195 77
|
2月前
|
监控 JavaScript
选择适合自己的Node.js内存监控工具
选择合适的内存监控工具是优化 Node.js 应用内存使用的重要一步,它可以帮助你更好地了解内存状况,及时发现问题并采取措施,提高应用的性能和稳定性。
124 76
|
2月前
|
监控 JavaScript 数据库连接
解读Node.js内存监控工具生成的报告
需要注意的是,不同的内存监控工具可能会有不同的报告格式和内容,具体的解读方法可能会有所差异。因此,在使用具体工具时,还需要参考其相关的文档和说明,以更好地理解和利用报告中的信息。通过深入解读内存监控报告,我们可以不断优化 Node.js 应用的内存使用,提高其性能和稳定性。
109 74
|
2月前
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
142 62
|
2月前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
79 31
|
1月前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
43 8
|
2月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
55 3
|
2月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
432 1
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。