JavaScript 哪些操作会造成内存泄露?
知识点
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
另一种说法是:内存泄漏是指分配给应用的内存不能被重新分配,即使在内存已经不被使用的时候。
垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
参考答案
- setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
- 闭包
因为Javascript范围的限制,许多实现依赖Javascript闭包。
闭包可以导致内存泄漏是因为内部方法保持一个对外部方法变量的引用,所以尽管方法返回了内部方法还可以继续访问在外部方法中定义的私有变量。
对Javascript程序员来说最好的做法是在页面重载前断开所有的事件处理器
- 控制台日志
- 循环引用(在两个对象彼此引用且彼此保留时,就会产生一个循环)
一个很简单的例子
一个DOM对象被一个Javascript对象引用,与此同时又引用同一个或其它的Javascript对象,这个DOM对象可能会引发内存泄漏。
这个DOM对象的引用将不会在脚本停止的时候被垃圾回收器回收。
要想破坏循环引用,引用DOM元素的对象或DOM对象的引用需要被赋值为null。
- DOM插入顺序
当2个不同范围的 DOM 对象连添加到一起的时候一个临时的对象会被创建。
这个DOM对象改变范围到document时,那个临时对象就没用了。
也就是说, DOM 对象应该按照从当前页面存在的最上面的 DOM 元素开始往下直到剩下的 DOM 元素的顺序添加,
这样它们就总是有同样的范围,不会产生临时对象。
如何检测
内存泄漏对开发者来说一般很难检测因为它们是由一些大量代码中的意外的错误引起的,但它在系统内存不足前并不影响程序的功能。
这就是为什么会有人在很长时间的测试期中收集应用程序性能指标来测试性能。
最简单的检测内存泄漏的方式是用任务管理器检查内存使用情况。在Chrome浏览器的新选项卡中打开应用并查看内存使用量是不是越来越多。
还有其他的调试工具提供内存监视器,比如Chrome开发者工具。这是谷歌开者这网站中的堆分析的特性的教程。
更多面试题
如果你想了解更多的前端面试题,可以查看本站的WEB前端面试题 ,这里基本包涵了市场上的所有前端方面的面试题,也有一些大公司的面试图,可以让你面试更加顺利。
面试题 | ||
---|---|---|
HTML | CSS | JavaScript |
jQuery | Vue.js | React |
算法 | HTTP | Babel |
BootStrap | Electron | Gulp |
Node.js | 前端经验相关 | 前端综合 |
Webpack | 微信小程序 | - |
这些题库还在更新中,如果你有不错的面试题库欢迎分享给我,我整理后放上来;人人为我,我为人人,互帮互助,共同提高,祝大家都拿到心仪的Offer!