JavaScript内存管理、performance

内存管理介绍:

  • 内存:由可读写单元组成,表示一片可操作哦空间。
  • 管理:人为的去操作一片空间的申请、使用和释放。
  • 内存管理:开发者主动申请空间、使用空间、释放空间。
  • 管理流程:申请——使用——释放

JavaScript的垃圾回收:JavaScript中内存管理是自动的,对象不再被引用时是垃圾,对象不能从根上访问到时是垃圾会被自动回收。

JavaScript中的可达对象:可以访问到的对象就是可达对象(引用、作用域链),可大的标准就是从根触发是否能够被找到,JavaScript中的根就可以理解为是全局变量对象。

GC算法:GC垃圾回收机制的简写,可以找到内存中的垃圾、并释放和回收空间。是一种机制,垃圾回收器完成具体的工作。

工作内容就是查找垃圾释放空间、回收空间。

算法就是工作时查找和回收所遵循的规则。

GC的垃圾:1、程序不再需要使用的对象。2、程序中不能再访问到的对象。

常见GC算法:引用计数、标记清除、标记整理、分代回收、

引用计数:核心思想:设置引用数,判断当前引用数是否为0。引用计数器,引用关系改变时修改引用数字。

优点:发现垃圾时立即回收,最大限度减少程序暂停。缺点:无法回收循环引用的对象,时间开销大。

标记清除算法:分标记和清除两个阶段完成。1、遍历所有对象标记活动对象2、遍历所有对象清除没有标记对象并抹去上次标记,回收相应的空间。

标记清楚算法优点:可以回收循环引用的对象,缺点,由于内存地址不连续,回收之后,空间碎片化;不会立即回收垃圾对象,清除时当前程序停止工作。

标记整理算法:可以看做是标记清除的增强。标记阶段的操作与标记清除一致,清除阶段会先执行整理,移动对象位置。

优点减少碎片化空间,缺点不会立即回收垃圾对象、

v8垃圾回收策略:采用分代回收的思想,内存分为新生代、老生代,针对不同对象采取不同算法。

v8常用的GC算法:分代回收,空间复制、标记清除、标记整理、标记增量。

v8如何回收新生代对象

v8内存(64位1.5G,32位800M)分配:

v8内存空间一分为二:小空间用于存储新生代对象(32M64位操作系统|16M32位操作系统)

新生代对象指的是存活时间较短的对象

新生代对象回收机制

回收对象采用复制算法+标记整理

新生代内存区分为两个等大小空间:使用空间from,空闲空间为To

活动对象存储于From空间

标记整理过后将活动对象拷贝到To空间

Form与To交换空间完成释放

回首细节说明:

拷贝过程中可能出现晋升存储到老生代存储区,(晋升是将新生代对象移动到老生代:两种情况,一代GC还存活的新生代需要晋升,To空间使用率超过25%)

如何回收老生代对象垃圾(64位1.4G,32位700M)老生代指存活时间较长的对象

主要采用标记清除、标记整理、增量标记算法

首先使用标记清除完成垃圾空间的回收(因为快啊)

采用标记整理进行空间优化,当新生代区域内容移动到老生代区域,且老生代存储区域空间不足存储该内容,触发标记整理。

采用增量标记进行效率优化。

新生代区域垃圾回收使用空间换时间,老年代区域打击回收不适合复制算法。

标记增量把一整段垃圾回收操作拆分为多个步骤完成。

为什么使用performance?

GC的目的是为了实现内存使用空间的良性循环,良性循环的基石是合理使用,时刻关注才能确定是否合理,而performance提供多种检测方式。

通过performance时刻监控内存。 

内存问题的体现:1、页面出现延迟加载或经常性暂停2、页面持续性出现糟糕的性能3、页面的性能随时间延长越来越差

界定内存问题的标准:1、内存泄漏:内存使用持续升高2、内存膨胀:在多数设备上都存在性能问题3、频繁垃圾回收,通过内存变化图分析。

监控内存的几种方式:1、浏览器任务管理器(sheft+esc)2、Timeline时序图记录3、堆快照分离DOM4、判断是否存在频繁的垃圾回收

堆快照分离DOM

堆快照原理:留存当前js堆,照片留存,获取堆信息,分离DOM。

垃圾对象时的DOM节点,分离状态的DOM节点

界面元素存活在DOM树上同时代码也没有引用

界面元素脱离DOM树上,但代码还在引用

判断是否存在频繁垃圾回收

为何要判断1、GC工作时应用程序是停止的2、频繁且过长的GC会导致应用假死3、用户使用中感知应用卡顿

如何判断1、Timeline中频繁上升下降2、任务管理器中数据频繁的增加减小

如何精准测试JavaScript的性能

Jsperf使用流程:使用github账号登录 、填写测试用例信息、填写准备代码、填写必要有setup与teardown代码、填写测试代码片段

1、缓存变量   2=选择合适的循环方式3、文档碎片化统一插入DOM document.createDocumentFragment

4、克隆优化节点操作5、克隆优化节点操作6、直接量替换 new Object

JSbench性能测试网站

代码性能优化

1、减少判断层级、作用域链查找层级、数据读取次数

2、字面量与构造式3、减少循环体中活动 4、减少声明和语句数

js中经常使用字面量、局部变量、数组元素、对象属性。字面量、局部变脸速度快(直接存放于栈中)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值