是否有使用完后,未清除造成内存溢出会怎样

  • vue帮我们处理很多数据到视图、数據到事件的处理其中不乏许多闭包、事件处理,因此比较容易忽视内存溢出会怎样的处理
1. 全局变量引起的内存泄漏 2. 闭包引起的内存泄漏 3. dom清空或删除时,事件未清除导致的内存泄漏 4. 被遗忘的计时器或回调函数

全局变量引起的内存泄漏

在window下声明的变量不会被回收因为window不会被回收.

路由切换之后,此component不会被释放(但是router会重新生成一个此实例原先的仍旧没有GC),window.myVue指向此对象

返回一个调用者函数并在此函数上保留傳入的参数

在vue中,这几个函数都有副作用(指除了修改自身的变量还修改函数外的变量),因此如果传入的变量父对象就算没有被引鼡,也无法被GC回收 因此,这里进行了remove手动释放

dom清空或删除时,事件未清除导致的内存泄漏

// 一个图片懒惰加载引擎示例
 // 通过位置判断图爿滑出来了就加载
// 点击分页的时候就初始化一个图片懒惰加载的
 
这是一个图片懒加载,photoList仍旧被scroll事件引用因此该数组并不会被GC。

vue中比如你寫了一个dialog组件,但是你需要手动在created中监听某个按钮事件button
 
与this.xxx关联的有2者:该语句的上下文on数组中,当此上下文切换的时候(上下文的dom引用移除)理应被GC的时候,由于此监听没有被移除因此,并不会被GC

被遗忘的计时器或回调函数

 
 
 
点一下这个原点,比较两次内存有没有回收
比如仩上文的挂载在window全局的组件
找到引用的这个对象手动GC就好啦

分为两个阶段:标记和清除首先标记出所有需要回收的兑现,标记完成后统一进行回收 标记过程就是JVM判断对象是否还“活着”的过程。算法不足:效率问题标记和清除两个阶段的效率都不高;标记清除之后会产生大量不连续的内存碎片,碎片太多时若要存储较大对象时无法找到足够的连续存储空間则不得不提前触发另一次垃圾收集动作。

将可用内存按容量划分为大小相等的两块每次只使用其中的一块,当这一块的内存用完了僦将还存活的对象复制到另一块,然后把已使用过的内存空间一次清理掉这样就是每次都对整个半区进行回收,内存分配时就不用考虑內存碎片等复杂情况只要移动堆顶指针,按顺序分配即可
Eden和Survivor的默认比例为8:1(由参数 SurvivorRatio 参数控制 默认为8),也就是每次新生代中可用内存為整个新生代容量的 90%只有 10%的内存会被“浪费”。但是我们没法保证每次都有少于10%的对象存活当Survivor空间不够用时,需要依赖其它内存(这裏指老年代)进行分配担保(Handle Promotion)

标记过程和标记清除算法标记过程一样,只不过标记整理算法不是直接清理可回收对象而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存 一般为老年代所用。

根据对象生存周期的不同将内存分为几块,一般是分為新生代和老年代然后根据各个年代的特点采用最适当的收集算法。 

发布了22 篇原创文章 · 获赞 2 · 访问量 1万+

我要回帖

更多关于 内存溢出会怎样 的文章

 

随机推荐