如何避免JavaScript中的内存泄漏?

作者 | 葡萄城技术团队
原文链接:https://my.oschina.NET/powertoolsteam/blog/10122640
前言
过去,我们浏览静态网站时无须过多关注内存管理,因为加载新页面时,之前的页面信息会从内存中删除 。然而 , 随着单页 Web 应用(SPA)的兴起,应用程序消耗的内存越来越多,这不仅会降低浏览器性能 , 甚至会导致浏览器卡死 。因此 , 在编码实践中,开发人员需要更加关注与内存相关的内容 。因此,小编今天将为大家介绍 JAVA 内存泄漏的编程模式 , 并提供一些内存管理的改进方法 。
什么是内存泄漏以及如何发现它?

如何避免JavaScript中的内存泄漏?

文章插图
什么是内存泄漏?
Java 对象被保存在浏览器内存的堆中,并通过引用方式访问 。值得一提的是,Java 垃圾回收器则运行于后台,并通过识别无法访问的对象来释放并恢复底层存储空间,从而保证 Java 引擎的良好运行状态 。
当内存中的对象在垃圾回收周期中应该被清理时 , 若它们被另一个仍然存在于内存中的对象通过一个意外的引用所持有,就会引发内存泄漏问题 。这种情况下,冗余对象会继续占据内存空间,导致应用程序消耗过多的内存资源,并可能导致性能下降和表现不佳的情况出现 。因此,及时清理无用对象并释放内存资源是至关重要的,以确保应用程序的正常运行和良好的性能表现 。
如何发现内存泄漏?
那么如何知道代码中是否存在内存泄漏?内存泄漏往往隐蔽且很难检测和定位 。即使代码中存在内存泄漏,浏览器在运行时也不会返回任何错误 。如果注意到页面的性能逐渐下降 , 可以使用浏览器内置的工具来确定是否存在内存泄漏以及是哪个对象引起的 。
任务管理器(不要与操作系统的任务管理器混淆)提供了浏览器中所有选项卡和进程的概览 。Chrome 中,可以通过在 linux 和 windows 操作系统上按 Shift+Esc 来打开任务管理器;而在 Firefox 中,通过在地址栏中键入 about:performance 则可以访问内置的管理器,它可以显示每个标签的 Java 内存占用情况 。如果网站停留在那里什么都不做,但 Java 内存使用量逐渐增加,那很可能是存在内存泄漏 。
如何避免JavaScript中的内存泄漏?

文章插图
开发者工具提供了一些先进的内存管理方法,例如,使用 Chrome 浏览器的性能记录工具 , 可以对页面的性能进行可视化分析 。在这个过程中 , 可以通过一些指标来判断是否存在内存泄漏问题,比如堆内存使用量增加的情况,并及时采取措施解决这些问题,以确保应用程序的正常运行和良好的性能表现 。
如何避免JavaScript中的内存泄漏?

文章插图
另外,通过 Chrome 和 Firefox 的开发者工具提供的内存工具 , 可以进一步探索内存使用情况 。队列内存使用快照的比较可以显示在两个快照之间分配了多少内存以及分配的位置,并提供额外信息来帮助识别代码中存在问题的对象 。这些工具为开发者提供了便利,能够更好地进行内存管理和性能优化 , 提高应用程序的质量和性能 。
Java 代码中常见的内存泄漏的常见来源:
研究内存泄漏问题就相当于寻找符合垃圾回收机制的编程方式,有效避免对象引用的问题 。下面小编就为大家介绍几个常见的容易导致内存泄漏的地方:
1. 全局变量
全局变量始终存储在根目录下,且永远不会被回收 。而在 Java 的开发中,一些错误会导致局部变量被转换到了全局,尤其是在非严格的代码模式下 。下面是两个常见的局部变量被转化到全局变量的情况:
  1. 为未声明的变量赋值
  2. 使用 this 指向全局对象 。
functioncreateGlobalVariables{leaking1 = 'I leak into the global scope'; // 为未声明的变量赋值
this.leaking2 = 'I also leak into the global scope'; // 使用this指向全局对象
};
createGlobalVariables;
window.leaking1;
window.leaking2;
** 注意:** 严格模式("use strict")将帮助您避免上面示例中的内存泄漏和控制台错误 。
2. 闭包
函数中定义的变量会在函数退出调用栈并且在函数外部没有指向它的引用时被清除 。而闭包则会保持被引用的变量一直存在,即便函数的执行已经终止 。
functionouter{
constpotentiallyHugeArray = [];
returnfunctioninner{
potentiallyHugeArray.push('Hello'); // function inner is closed over the potentiallyHugeArray variable


推荐阅读