垃圾回收
来自智得网
简介
垃圾回收是一种内存管理的机制,因为内存空间是有限的,所以程序运行过程中不能无限的申请内存而不释放。
内存管理一般有两种机制,一种是手动管理,程序开发者自行分配以及释放内存。C语言中的malloc和free,C++中的new,delete分别是分配以及释放的API。
内存一般分为堆内存和栈内存,对于任何语言来说,栈内存基本都是运行时自动回收的,因为栈内存是和线程相关的,所以栈内存和线程的生命周期一致。
对于堆内存而言,其生命周期相对不确定,甚至比分配内存的线程生存的更久,回收机制会更加复杂。因为和内存绑定的变量一旦创建,其访问的路径很难追踪,不知道其被多少线程引用,再加上复杂的并发场景,很难确定哪个线程会在最后访问这个变量,一旦提前释放,还会引发系统运行的异常。所以手动释放内存的难度很高,经常会出现内存泄漏的问题。
为了更加简洁方便的管理内存,提出了垃圾回收机制。
原理
垃圾回收算法需要关注几个部分:
- 从堆内存标记把垃圾也就是没有再被引用的内存标记出来
- 对内存标记出来的垃圾进行清理,从而释放内存
- 垃圾回收的策略,包括执行的时机,清理的比例等。
标记算法
垃圾标记的常用算法有计数法和可达性分析法,计数法通过统计每个内存变量被引用的次数来判定该内存是否是垃圾。计数法存在的问题是如果两块内存之间存在循环依赖的话,那么其引用计数永远也可能变为0,这样内存就永远无法回收。
可达性分析法的原理是从一组GC Root出发,标记所有的对象,最终没有被标记的也就是垃圾。
回收算法
常用的回收算法有复制法,清除法,整理法。
复制法是指把未被标记的内存复制到一块全新的区域,然后就可以把之前的区域整体回收了。
清除法是指把标记为垃圾的内存空间直接清除,可以被复用。
清除法将垃圾清理之后,会出现内存碎片,标记整理算法会在清楚之后重新移动内存的位置,尽量使得已占用内存变的连续。
GC策略
GC测试有分代回收等。