【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 ...
随机推荐
- 多进程界面开发-Qt试玩儿
目录 一.概述 二.效果展示 三.使用方法 1.启动外部进程 2.创建Qt窗口 3.加入到主进程布局 四.嵌入NotePad 五.调用Ping命令 六.嵌入其他QWidget窗体 七.相关文章 一.概 ...
- element-ui源码之组件通信那些事
最近在用element-ui重构前端项目,无意之中翻阅到一个比较好用的组件间通信方式,借助于vue的封装的发布-订阅消息模式与mixin语法.在开始之前先总结下vue常用的组件间通信方式,具体如下: ...
- maven中引入oracle驱动报错Missing artifact com.oracle:ojdbc14:jar
maven中央库中查找ojdbc14 ,复制依赖,maven项目中引入ojdbc14 来回折腾,加仓库镜像,各种修改setting.xml 文件 就是不行,后来看到一位网友博客,MMP Oracle ...
- kubernetes实战篇之helm安装
系列目录 Helm是kubernetes的应用包管理工具,是CNCF孵化器下的一个项目,主要用来管理 Charts.类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM.它提供了一种简单 ...
- Java多线程(五):死锁
死锁 概念 当线程Thread-0持有锁Lock1,Thread-1持有锁Lock2,此时Thread-0申请Lock2锁的使用权,Thread-1申请Lock1锁的使用权,Thread-0和Thre ...
- 微服务-springboot+websocket在线聊天室
一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- 鼠标滑至某位置,在鼠标旁边出现详情弹窗div
首先效果如下: 代码如下: //这个是一个循环,循环所有name为xx的td标签(也就是给tdname为XXX的添加事件)$("td[name='strGoodsSKU']").e ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- Single Thread Execution设计模式
public class Test { public static void main(String[] args){ // FlightSercurityTest.test(); // EatNoo ...
- ASP.NET 前端数据绑定---<%#%>及Eval()的使用
ASP.NET 前端html代码中会经常出现的<%%>的代码,里面的文本其实就是不能直接输出到客户端浏览器的文本,是需要服务器解释的. 在ASP中,<%%>里面的文本是vbsc ...