【JS档案揭秘】第一集 内存泄漏与垃圾回收
程序的运行需要内存,对于一些需要持续运行很久的程序,尤其是服务器进程,如果不及时释放掉不再需要的内存,就会导致内存堆中的占用持续走高,最终可能导致程序崩溃。
不再需要使用的内存,却一直占用着空间,得不到释放,这就叫内存泄漏。
在JS中,我们都知道,基本数据类型是存在栈(stack)中,而引用数据类型是存在堆(heap)中。存在栈中的数据,会被自动处理掉。但存在堆中的数据则不然。
JS引擎有个垃圾回收机制,可以帮助我们来清除不需要的数据。关键来了,我们怎么告诉JS引擎这个我不再需要这个数据呢?
答案就是:切断它的引用,让它变成一座无法到达的岛屿。
这就是所谓的“标记清除”。也就是说,我们对堆中的引用类型数据做一个遍历,标记一下它们是否是可以被外部访问到的:
let a = {name:'zhang'};
let b = a;
let c = {name:'zhao'};
c = null;
在上面的这段代码中,{name:'zhang'}这个对象分别被变量a和变量b引用。{name:'zhao'}这个对象一开始被变量c引用,后来c被重新赋值,{name:'zhao'}这个对象的引用突然被切断,再也无法被访问到了,自己变成了一个“孤岛式数据”,无法被外部访问,被当成了垃圾。

而垃圾的宿命,就是被JS引擎回收。

我们来执行一下上述这段代码,每点击一次,就给obj存入1000个不同对象的引用,连续点击10s,停止30s。并把这个过程录制下来。
怎么录?打开chrome的performance即可录制,看看这40s的内存堆(JS heap)的走势。

(结果是令人寒心的,堆内存占用从15M左右飙到最高30M,且基本没有什么回落,居高不下)
现在我们把代码改一改,在末尾增加一句this.obj = []。用于清除本次操作产生的1000个引用。

按照同样的手法,点击10s,停止30s,总共录制40s。效果如下:

(可以看到中途最高飙到24.7M,但是垃圾回收在第5s和第10s都介入了一次,使得内存占用大幅减少)
可以看到垃圾回收还是很有用的,同时也可以看到,垃圾回收并不是无时无刻都在进行,因为垃圾回收这个操作也有性能损耗,从我实测的结果来看,它是按照一定的时间间隔进行的。
【JS档案揭秘】第一集 内存泄漏与垃圾回收的更多相关文章
- Java的内存泄漏和垃圾回收机制
JAVA会产生内存泄露吗?首先,答案是肯定的. Java尽管有垃圾回收器,但依旧存在泄漏. Java内存泄漏跟C/C++内存泄漏的概念不一样:C/C++的内存泄漏是指Malloc了一些资源.最后没有f ...
- [Lua]内存泄漏与垃圾回收
参考链接: http://colen.iteye.com/blog/578146 一.内存泄漏的检测 Lua的垃圾回收是自动进行的,但是我们可以collectgarbage方法进行手动回收.colle ...
- Java中内存泄露及垃圾回收机制
转自:http://blog.sina.com.cn/s/blog_538b279a0100098d.html 写的相当不错滴...................... 摘 要 Java语言中,内 ...
- 【JS档案揭秘】第二集 Event loop与执行栈
我时常在思考关于JS的很多知识在工作中有什么用?是否只能存在于面试这种理论性的东西中,对于我们的业务和工作,它们又能扮演怎样的角色.以后在JS档案揭秘的每一期里,都会加入我对于业务的思考,让这些知识不 ...
- 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)
使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...
- .NET基础 (05)内存管理和垃圾回收
内存管理和垃圾回收1 简述.NET中堆栈和堆的特点和差异2 执行string abc="aaa"+"bbb"+"ccc"共分配了多少内存3 ...
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集
(转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...
- JVM内存管理及垃圾回收
一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...
随机推荐
- 教妹子用IDEA创建web应用,部署到Tomcat服务器
自从上一篇原创发表之后,粉丝反应热烈.主要分两派,一派关注技术的,觉得看了那么多的公众号文章,终于找到一篇能看懂的了,于是沾沾自喜.另一派是关注妹子的,感叹自己空有一身绝技,公司里却无妹子可教,大喊可 ...
- 系统学习 Java IO (三)----文件类 File
目录:系统学习 Java IO---- 目录,概览 Java IO API 中的 File 类可以访问基础文件系统. 使用 File 类,可以: 检查文件或目录是否存在. 如果目录不存在,创建一个目录 ...
- VsCode 快捷键(Mac)
按键使用符号: Shift (⇧) Control(或 Ctrl)⌃ Command(或 Cmd)⌘ Option(或 Alt)⌥ 打开文件夹 Cmd+o 调试 // 开启调试 F5 // 停止调试 ...
- redis安装与php安装redis模块
一.安装redis 1.下载 wget https://github.com/antirez/redis/archive/2.8.23.tar.gz 2.解压缩 tar -zxvf 2.8.23.ta ...
- Xmanager 5远程连接CentOS7图形化界面
1.安装Xmanager 5下载链接:https://pan.baidu.com/s/1JwBk3UB4ErIDheivKv4-NA提取码:cw04 双击xmgr5_wm.exe进行安装 点击‘下一步 ...
- HTTP 学习笔记03
通用信息头 Cache-Control : no-cache(不缓存当前请求) [*] Connection:close(返回当前请求后立即断开)[*] Date:...(HTTP消息产生的时间) P ...
- 获取浏览器ip地址
<script src="http://lib.sinaapp.com/js/jquery/1.8.3/jquery.min.js"></script> & ...
- InnoDB存储引擎--学习笔记-redo log
目录 1. 引言 2. 重做日志文件和相关概念介绍 + 2.1. 重做日志文件和bin log + 2.2. LSN(log squence number) 3. 重做日志文件基本工作原理 4. 重做 ...
- WebGL2系列之多采样渲染缓冲对象
在很久很久以前,盘古开辟了天地,他的头顶着天,脚踩着地,最后他挂了.他的毛发变成了森林,他的血液变成了河流,他的肌肉变成了大地......卡! 哦,不对,在很久很久以前,你属于我,我拥有你.你还有没有 ...
- Pandas Series 与 DataFrame 数据创建
>>> import pandas as pd >>> import numpy as np >>> print(np.__version__), ...