像C语言这种偏底层的高级语言,是需要程序员手动申请和释放内存的,典型的用了 malloc 和 free 两种方法。
但是像java和js这种语言有垃圾回收机制。意味着程序员不需要手动的去操作内存。
常见的垃圾回收机制有两种:
引用计数算法
古老的垃圾回收方法,在IE浏览器上有内存泄漏,12年以后大部分现代浏览器都是基于标记清除算法的改良版。
引用计数: 当有引用指向这个对象时,则这个对象的引用计数加1,当引用失效时,则引用计数减1,当引用计数为0时,则表示可以进行垃圾回收了。
缺点:
- 无法解决循环引用的问题。
-
每次被引用时都需要更新引用数,会增加cpu的开销,即时现在内存是够用的。
循环引用
循环引用
标记清除算法
算法有两个阶段:
标记阶段:
在栈里面开始(栈里面保存的是堆空间地址),以这个为root元素,找到这个root元素关联的所有可访问的对象;刚开始的时候每个对象有个属性叫marked,值为false。如果能被root元素访问到,则将marked值置为true;
清除阶段
遍历堆中的所有对象,找到所有marked值为false的对象,进行回收。
同时将那些marked值为true的对象重新置为false。
优点: 解决循环引用问题。
缺点:
- 效率低下: 因为需要递归标记 且 需要遍历堆中的所有对象。
- 垃圾回收时,主应用程序需要挂起。
- 会产生内存碎片。当应用程序需要大块连续空间的时候可能就分配不到。











网友评论