什么是内存泄漏?什么原因会导致呢?
参考答案:
内存泄露的解释:程序中己动态分配的堆内存由于某种原因未释放或无法释放。
- 根据JS的垃圾回收机制,当内存中引用的次数为0的时候内存才会被回收
- 全局执行上下文中的对象被标记为不再使用才会被释放
内存泄露的几种场景
- 全局变量过多。通常是变量未被定义或者胡乱引用了全局变量
js
// main.js
// 场景1
function a(){
b=10;
}
a();
b++;
// 场景2
setTimeout(()=>{
console.log(b)
},1000)- 闭包。 未手动解决必包遗留的内存引用。定义了闭包就要消除闭包带来的副作用。
js
function closuer (){
const b = 0;
return (c)=> b + c
}
const render = closuer();
render();
render = null; // 手动设置为null,GC会自己去清除- 事件监听未被移除
js
function addEvent (){
const node = document.getElementById('warp');
node.addEventListener('touchmove',()=>{
console.log('In Move');
})
}
const onTouchEnd = (){
const node = document.getElementById('warp');
node.
}
useEffect(()=>()=>{
const node = document.getElementById('warp');
node.removeEventListener('touchmove');
}) // 类似react 生命周期函数: componentWillUnmount
render(<div id='warp' onTouchEnd={onTouchEnd}>
// code...
</div>)- 缓存。建议所有缓存都设置好过期时间。
题目要点:
答题思路
什么是内存泄漏?
- 定义:内存泄漏(Memory Leak)是指程序中已分配的内存由于某种原因未被释放或无法释放,导致这部分内存无法再次被使用,造成内存的浪费和程序的潜在性能问题。
什么原因会导致内存泄漏?
全局变量:不当地使用全局变量或在全局作用域中创建变量,这些变量在整个页面生命周期内都不会被自动释放。
闭包:闭包可以保持对外部函数作用域中变量的引用,如果这些变量是较大的对象或数组,且闭包本身未被及时销毁,那么这些变量所占用的内存也无法被释放。
DOM引用:在JavaScript中,如果DOM元素被JavaScript变量引用,即使这些DOM元素已经从页面上移除了,它们所占用的内存也不会被释放,因为JavaScript仍然保持着对这些元素的引用。
定时器:如
setTimeout或setInterval创建的定时器,如果定时器中的回调函数引用了外部变量,而这些变量又包含了大量数据或DOM元素,那么在定时器未被清除之前,这些资源都无法被释放。第三方库:使用的第三方库可能存在内存泄漏的问题,特别是当这些库管理大量资源(如DOM元素、数据等)时。
内存泄漏的连锁反应:一个小的内存泄漏可能会引发连锁反应,导致更多的内存泄漏,最终严重影响程序的性能和稳定性。
考察要点
内存管理知识:考察面试者对JavaScript内存管理机制的理解,包括垃圾回收机制、作用域链等。
编程习惯:通过询问内存泄漏的原因,考察面试者的编程习惯和代码质量意识。
问题解决能力:面试者是否能够识别和解决潜在的内存泄漏问题,以及是否有有效的策略来预防内存泄漏。