面试官:JavaScript的垃圾回收机制你了解吗?
日期:2018-09-12
来源:程序思维浏览:1665次

Js有一个自动垃圾收集机制。垃圾收集器定期执行。
在JS中收集垃圾最常见的方法是标记。
工作原理:当变量进入环境时,将其标记为“进入环境”。当变量离开环境时,它被标记为“远离环境”。当标签“远离环境”时回收内存。
工作过程:
1.垃圾收集器将在运行时标记存储在内存中的所有变量。
2.删除环境中的变量以及环境中变量引用的变量的变量。
3.再次标记将被视为要删除的变量。
4.垃圾收集器完成内存清理,销毁标记值并回收它们占用的内存空间。
参考计数方法
工作原理:跟踪每个值的引用次数。
工作过程:
1.声明一个变量并为变量赋一个引用类型的值。引用类型值的引用号是1。
2.将相同的值分配给另一个变量。对此引用类型值的引用数增加1。
3.当包含此引用类型的值的变量分配给另一个值时,对引用类型值的引用数减1。
4.当引用数变为0时,无法访问该值。
5.当垃圾收集器接下来运行时,它释放值占用的内存,引用计数为零。
但是循环在引用时不会释放内存
循环引用是对象A包含另一个指向对象B的指针,而B也包含对A的引用。
由于IE中BOM、DOM的实现使用COM,COM对象使用的垃圾收集机制是引用计数策略。因此循环会引起一个问题。
解决方案:手动断开js对象和DOM之间的链接。赋值为null。 IE9将DOM和BOM转换为真正的JS对象,因此避免了这个问题。
什么会导致内存泄漏?
虽然有一个垃圾收集机制,如果我们不正确地编写代码,它仍然会导致内存泄漏。
1.由意外的全局变量引起的内存泄漏。
原因:全局变量不会被回收。
解决方案:避免使用严格模式。
2.关闭引起的内存泄漏
原因:闭包可以在函数中维护局部变量,以便它们不会被释放。
解决方案:在外部定义事件处理程序,取消阻塞闭包,或者在定义事件处理程序的外部函数中删除对dom的引用。
3.未清理DOM元素引用原因:虽然其他地方已被删除,但仍有对象中的dom引用。
解决方案:手动删除。
4.忘记定时器或回叫
原因:计时器中有一个dom参考。即使dom被删除,计时器仍然在那里,所以内存中仍有这个dom。
解决方案:手动删除计时器和dom。
5.由子元素引用引起的内存泄漏
原因:div中的ul得到这个div,间接指的是给定的li,那么此时因为div间接指li,即使li被清空,它仍然在内存中,只要li没有被删除,他的父元素不会被删除。
解决方案:手动删除空。
内存是什么?什么不在记忆中?
基本类型是:Undefined、Null、Boolean、Number、String
基类型的值存储在存储器中并存储在堆栈存储器中。将基本类型的值从一个变量复制到另一个变量会创建该值的副本。
参考类型:对象
引用类型的值是一个对象,存储在堆内存中。
1.包含引用类型值的变量实际上不包含对象本身,而是包含指向对象的指针。将引用类型的值从一个变量复制到另一个变量,副本实际上是一个指针,因此两个变量最终都指向同一个对象。
2. js不允许直接访问内存中的位置,也就是说,它不能直接访问操作对象的内存空间。当您操作对象时,您实际上正在处理对象的引用而不是实际对象。
堆栈和堆之间的区别
堆栈空间分配差异:
1、堆栈(操作系统):由操作系统自动分配释放,存储函数的参数值,局部变量的值等。它以类似于数据结构中的堆栈的方式操作;
2、堆(操作系统):通常由程序员发布,如果程序员没有释放,程序可能会在程序结束时由OS回收,分配类似于链表。
两个、堆栈缓存方法的区别:
1、堆栈使用1级缓存,它们通常在调用存储空间时,在调用后立即释放;
2、堆存储在二级缓存中,生命周期由虚拟机的垃圾收集算法确定(一旦它可以作为孤立对象再循环)。因此调用这些对象的速度相对较低。
三个、堆栈数据结构的区别:
堆(数据结构):堆可以被认为是树,例如:堆排序;堆栈(数据结构):高级数据结构。
- 上一篇:百度echarts入门教程
- 下一篇:如何正确处理JavaScript中的错误
精品好课