目录
垃圾
可达对象
GC算法(垃圾回收机制)
引用计数算法
优点
缺点
标记清除算法
优点
缺点
标记整理算法
优点
缺点
V8
V8垃圾回收
新生代对象回收
晋升条件
老生代对象回收
性能监控Performance
浏览器任务管理器
内存分析
编辑
JSBench(代码测试网站)
垃圾
对象不再被引用时是垃圾;
对象不能从根(全局)上访问到时是垃圾;
可达对象
在一个作用域链上,只要通过根可以有路径查找到的对象都是可达对象。
可以访问到的对象就是可达对象(可以通过引用、作用域链查找到)
可达的标准就是从根(全局)出发是否能够被找到
GC算法(垃圾回收机制)
GC是一种机制,垃圾回收器完成具体的工作。工作的内容就是查找释放空间、回收空间。算法就是工作时查找和回收所遵循的规则。
引用计数算法
设置引用数,判断当前引用数是否为0。
优点
可以即时回收垃圾对象。
减少程序卡顿时间。
缺点
无法回收循环引用的对象
时间开销大
标记清除算法
分标记和清除二个阶段完成
遍历所有对象找标记活动对象(非垃圾)。
遍历所有对象清除没有标记对象。
优点
可以解决引用计数中的循环引用的问题。
缺点
容易产生碎片化空间,不能得到最大化利用。
不会立即回收垃圾对象。
标记整理算法
可以看做是标记清除的增强;
标记阶段的操作和标记清除一致
清除阶段会先执行整理,移动对象位置(整理对象使垃圾被释放后空间连续)
优点
减少碎片化空间。
缺点
不会立即回收垃圾对象。
V8
一款主流JavaScript执行引擎,采用即时编译,内存设限(64位操作系统为1.5G,32位操作系统为800MB )
V8垃圾回收
V8将内存空间一分为二,新生代对象(存活时间较短的对象)存储区(被分为From和To两个等大小空间)和老生代存储区,如下图:
回收过程采用复制算法+标记整理。
新生代对象回收
活动对象存储于From空间,标记整理后将活动对象拷贝至To,From与To交换空间完成释放。
拷贝过程中可能出现晋升(将新生代对象移动至老生代)
晋升条件
一轮GC还存活的新生代需要晋升
To空间的使用率超过25%需要晋升
老生代对象回收
主要采用标记清除、标记整理、增量标记算法。
首先使用标记清除完成垃圾空间的回收。
当新生代对象晋升且老生代空间不足时会采用标记整理进行空间优化。
增量标记用于进行效率优化。
性能监控Performance
google浏览器控制台下的performance板块,可以录制交互或页面加载过程的性能变化。
浏览器任务管理器
使用Shift+Esc打开,在该面板上右击鼠标可以选择需要显示的内容例如JavaScript使用过的内存。
上图中内存占用空间表示DOM节点所占据的大小;
JavaScript使用的内存表示为为js中的堆大小,括号中的大小为所有可达对象当前使用的大小。
内存分析
JSBench(代码测试网站)
JSBench.me - JavaScript performance benchmarking playground
JavaScript代码执行快慢测试网站