内存泄漏简介

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。

垃圾回收机制

最常使用的方法叫做"引用计数"(reference counting):语言引擎有一张"引用表",保存了内存里面所有的资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。

const arr = [1, 2, 3, 4];
console.log('hello world');

上面代码中,数组[1, 2, 3, 4]是一个值,会占用内存。变量arr是仅有的对这个值的引用,因此引用次数为1。尽管后面的代码没有用到arr,它还是会持续占用内存。

let arr = [1, 2, 3, 4];
console.log('hello world');
arr = null;

上面代码中,arr重置为null,就解除了对[1, 2, 3, 4]的引用,引用次数变成了0,内存就可以释放出来了。

内存泄漏的识别方法

经验法则是,如果连续五次垃圾回收之后,内存占用一次比一次大,就有内存泄漏。这就要求实时查看内存占用。

浏览器识别

Chrome 浏览器查看内存占用,按照以下步骤操作。

  1. 打开开发者工具,选择 Timeline 面板
  2. 在顶部的Capture字段里面勾选 Memory
  3. 点击左上角的录制按钮。
  4. 在页面上进行各种操作,模拟用户的使用情况。
  5. 一段时间后,点击对话框的 stop 按钮,面板上就会显示这段时间的内存占用情况。

如果内存占用基本平稳,接近水平,就说明不存在内存泄漏。

命令行识别

命令行可以使用 Node 提供的process.memoryUsage方法。

console.log(process.memoryUsage());
// { rss: 27709440,
//  heapTotal: 5685248,
//  heapUsed: 3449392,
//  external: 8772 }

process.memoryUsage返回一个对象,包含了 Node 进程的内存占用信息。该对象包含四个字段,单位是字节,含义如下。

  • rss(resident set size):所有内存占用,包括指令区和堆栈。
  • heapTotal:"堆"占用的内存,包括用到的和没用到的。
  • heapUsed:用到的堆的部分。
  • external: V8 引擎内部的 C++ 对象占用的内存。

判断内存泄漏,以heapUsed字段为准。

WeakSet 和 WeakMap

前面说过,及时清除引用非常重要。但是,你不可能记得那么多,有时候一疏忽就忘了,所以才有那么多内存泄漏。

最好能有一种方法,在新建引用的时候就声明,哪些引用必须手动清除,哪些引用可以忽略不计,当其他引用消失以后,垃圾回收机制就可以释放内存。这样就能大大减轻程序员的负担,你只要清除主要引用就可以了。

ES6 考虑到了这一点,推出了两种新的数据结构:WeakSet 和 WeakMap。它们对于值的引用都是不计入垃圾回收机制的,所以名字里面才会有一个"Weak",表示这是弱引用。详细具体看阮一峰的ECMAScript 6 入门。

JavaScript内存泄漏相关推荐

  1. 什么是javascript内存泄漏?以及解决方法

    什么是javascript内存泄漏?以及解决方法 一.什么是javascript内存泄漏? 二.常见的内存泄漏 1.意外的全局变量(通常是变量未被定义或者胡乱引用了全局变量) 2.计时器 3.闭包 4 ...

  2. 介绍两个非常好用的Javascript内存泄漏检测工具

    内存泄漏对开发者来说一般很难检测因为它们是由一些大量代码中的意外的错误引起的,但它在系统内存不足前并不影响程序的功能.这就是为什么会有人在很长时间的测试期中收集应用程序性能指标来测试性能. 最简单的检 ...

  3. JavaScript内存泄漏知多少?

    垃圾回收解放了我们,它让我们可将精力集中在应用程序逻辑(而不是内存管理)上.但是,垃圾收集并不神奇.了解它的工作原理,以及如何使它保留本应在很久以前释放的内存,就可以实现更快更可靠的应用程序.在本文中 ...

  4. javascript内存泄漏调试工具mac_node.js 内存泄漏的秘密

    一直以来,跟踪 Node.js 的内存泄漏是一个反复出现的话题,人们始终希望对其复杂性和原因了解更多. 并非所有的内存泄漏都显而易见.但是,一旦我们确定了其模式,就必须在内存使用率,内存中保存的对象和 ...

  5. javascript内存泄漏调试工具mac_Vuex3.1.1更新:支持jsDelivr,修复内存泄漏

    JavaScript 已成为庞大.多样化并快速发展的编程语言.每当 JS 的框架或库发布更新,社区中与之相关的项目也会随之作出改进--Vue.js 及其附属项目就是典型例子. Vuex 是简单直观的状 ...

  6. Meta开源JavaScript内存泄漏监测工具MemLab

    一.MemLab简介 上周,Facebook母公司Meta 宣布了开源 MemLab,一个基于 Chromium 的浏览器的 JavaScript 应用程序内存泄漏监测工具.同时,Facebook 技 ...

  7. 排查Javascript内存泄漏

    引言 也许你已经知道,Chrome DevTools里的Performance面板和Memory面板可以用来定位内存问题.但当你真正上手使用它们的时候,往往会觉得不知所措 -- 因为里面有着各种各样的 ...

  8. JavaScript内存泄漏定位

    本文转自JS内存泄漏排查方法--Chrome Profiles 概述 Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是其中一个.Heap Profilin ...

  9. Javascript内存泄漏与优化

    1. 什么是内存泄漏 内存泄漏是指在Javascript中,已经分配内存地址的对象由于长时间未释放或者是无法释放造成了长期占用内存,使内存浪费,最终导致运行的应用响应速度变慢以及最终崩溃的情况. 2. ...

最新文章

  1. 在软件中常用的“撤销”操作,其本质是“栈”!
  2. 【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )
  3. 数据结构:O(nlogn)算法
  4. Pyramid Scene Parsing Network
  5. rest spring_Spring REST:异常处理卷。 3
  6. ps抠头发插件_彻底告别抠图的烦恼!PS自动抠图超级插件Topaz ReMask大放送
  7. Java基础--面向对象以及相关知识
  8. haproxy配置代理tomcat和nginx_Nginx负载均衡配置实例
  9. python基础语法训练
  10. 实用的 Python —— os.system() 在 python 语句中执行 dos 命令
  11. 开课吧课堂:finally如何使用?作用是什么?
  12. 罗技鼠标可以用c语言吗,罗技无线鼠标连接实用程序软件 v1.00.23 官方最新版
  13. 红色警戒2修改器原理百科(七)
  14. HTML5与CSS3学习笔记【第八章 操作样式表】
  15. YiLu代理中住宅IP代理和数据中心/机房IP代理分析及对比
  16. C++ 数学与算法系列之认识格雷码
  17. 西瓜卡顿 ANR 优化治理及监控体系建设
  18. 图像特征提取与匹配之SIFT算法
  19. Bluedroid协议栈BTU线程处理HCI数据流程分析
  20. idea中同一个项目同时启动多个端口进行访问

热门文章

  1. Orders matters: seq2seq for set 实验
  2. WebSocket API简介
  3. 网站初学笔记3-HTML实用元素5
  4. RHEL6 下安装tmux
  5. 《微软-统一沟通-UC 2013》-1-部署-基础架构-2-Add a domain controller
  6. firefox推荐插件
  7. 在衡量MPLS性能时需要注意什么
  8. 如何合并两个Docker 镜像
  9. MySQLFabric概述
  10. 今天看到的关于深度学习的一篇文章,可以好好学习下