当前位置: 首页 > Web前端 > JavaScript

内存泄漏&JavaScript-GC垃圾回收机制-springboot实战电商项目mall4j

时间:2023-03-27 00:11:55 JavaScript

springboot实战电商项目mall4j(https://gitee.com/gz-yami/mall4j)java商城系统源码内存leak什么是内存泄漏?程序需要内存才能运行。操作系统或运行时必须在程序请求时提供内存。对于持续运行的服务进程,不再使用的内存必须及时释放。否则,内存占用会越来越高,轻则影响系统性能,重则导致进程崩溃。简单的说:不再使用,没有及时释放的内存称为内存泄漏。有些语言(如C语言)必须手动释放内存,即内存管理是程序员的责任,所有的内存都需要手动释放,想想就很麻烦。大多数语言都提供自动内存管理,我们称之为“垃圾收集机制”。JS垃圾回收机制——两种回收策略时间间隔(或者代码执行中预定的回收时间),周期性的找出那些不再使用的变量,然后释放它们占用的内存。1.Mark-and-sweepMark-and-sweep是JavaScript中重用最多的垃圾回收方法。当一个变量被使用时,垃圾回收会将变量标记为进入环境。理论上,进入环境的变量是绝对不能释放的,因为环境中的变量极有可能正在被使用;当一个变量离开环境时,垃圾回收会将变量标记为离开环境当变量标记为这种状态时,垃圾回收器会定时执行,释放对应变量占用的内存//声明一个函数thatadds1functionaddOne(num){//垃圾收集标记sum为“进入环境”letsum+=num//垃圾收集标记sum为“离开环境”returnsum}addOne(1)//当前输出2,几乎所有现代浏览器都使用标记清除垃圾收集算法2.引用计数引用计数是最基本的垃圾收集算法。该算法将“是否不再需要该对象”的定义简化为“该对象是否有其他对象引用它”。如果没有对该对象的引用(零引用),该对象将被垃圾回收。这种策略有一个缺陷:当发生循环引用时,计数永远不会归零//examplefunctionfn(){varojb1={};varojb2={};ojb1.aa=ojb2;//o引用o2ojb2.aa=ojb1;//o2引用oreturn"circularreference";}//callsfnfn();例子中ojb1和ojb2是通过各自的属性互相引用的,也就是此时他们的引用都是2,那么在引用计数这种策略下,obj1和obj2是不会被释放的,因为他们的引用计数不为0,所以这个方法有内存泄漏的风险JS中常见的内存泄漏了解垃圾回收机制,回到内存泄漏的问题,日常开发中有哪些情况容易导致内存泄漏?全局变量函数fn(){bar1='sometext';//没有声明直接赋值其实是一个全局变量=>window.bar1this.bar2='sometext'//全局变量=>window.bar2}fn()未清除定时器functionfn(){setInterval(function(){varbox=document.querySelector('#box');if(box){box.innerHTML=JSON.stringify(serverData);}},5000);//每5秒调用}fn()事件监听器添加事件监听器但不移除window.addEventListener('scroll',this.handleScroll)closurevarclosure=function(){varcount=0;返回函数(){返回计数++;}}constfn=closure();控制台日志(fn());//0console.log(fn());//1console.log(fn());//2每次调用fn时,count值都会在之前的值的基础上加1,即count引用一直保存在里面存储springboot实战电商项目mall4j(https://gitee.com/gz-yami/mall4j)java商城系统源码