内存泄漏 & JavaScript-GC垃圾回收机制 - java商城系统源码项目mall4j发表时间:2021-12-07 08:56 java商城系统源码什么是内存泄漏 ?程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。对于持续运行的服务进程,必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。 简单地说:不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak) 有一些语言(比如C语言)必须手动释放内存,即内存管理由程序员来负责,所有的内存都需要手动释放,想想就很繁琐,绝大多数的语言提供自动的内存管理,我们称之为 ”垃圾回收机制“ JS的垃圾回收机制-两种收集策略垃圾收集机制原理:垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间), 周期性地去找出那些不再继续使用的变量,然后释放其占用的内存。 1. 标记清除标记清除(mark-and-sweep) 是 JavaScript中最重用的垃圾收集方式 当一个变量在使用时,垃圾收集会给变量添加标记为 当一个变量离开环境时,垃圾收集会将变量标记为
目前所有的现代浏览器几乎都使用 标记清除 这种垃圾回收算法 2. 引用计数引用计数是最初级的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。 这种策略存在缺陷:当发生循环引用时,计数永远不会归零 // 示例functionfn(){
var ojb1 = {};
var ojb2 = {};
ojb1.aa = ojb2; // o 引用 o2 示例中 ojb1 和 ojb2 通过自身的属性互相引用对方,即它们的被引用此时都为2 那么在引用计数这种策略下,obj1 和 obj2 将不会被释放,因为它们引用次数不为0,所以此方法存在内存泄漏的风险 JS中常见的内存泄漏了解了垃圾回收机制,回到内存泄漏的问题,日常开发中有哪些情况容易造成内存泄漏呢? 全局变量 functionfn() {
未清除的定时器 function fn() {
setInterval(function() {
var box = document.querySelector('#box');
if(box) {
box.innerHTML = JSON.stringify(serverData);
}
}, 5000); // 每 5 秒调用一次
}
fn() 事件监听 添加了事件监听但未移除 window.addEventListener('scroll', this.handleScroll) 闭包 var closure = function(){
var count = 0;
returnfunction(){
return count ++;
}
}
const fn = closure();
每次调用fn时,count 值都基于上一次的值增加1,即count的引用一直保存在内存中 java商城系统源码 |