常见的垃圾收集器算法有哪些?
在大部分编程语言中,动态内存分配是必不可少的。为了防止内存泄漏,需要进行垃圾回收(Garbage Collection,简称GC),即在进行垃圾回收时收集并释放不再需要使用的存储器资源,在内存使用过多而导致程序出现异常时,垃圾回收是很重要的。而垃圾回收主要有2类算法 — 标记-清扫(Mark and Sweep)和复制式(Copying)。下面分别介绍。
1. 标记-清扫(Mark and Sweep)
1.1 算法原理
标记-清扫算法分为两个阶段
- 标记阶段(Marking):利用程序的“根”信息,开始遍历所有的对象,标记所有与所给对象间接或直接相关联的对象。在GC开始时,一些对象被标记为不需要清楚(“活动对象”,例如正在使用的对象),其他的对象则需要被清除;
- 清扫阶段(Sweeping):遍历堆,不归属于活动对象的对象将被释放。
1.2 算法优缺点
- 优点:应用广泛,可适用于大型数据;适用于不能移动的情况。
- 缺点:不能处理对象间引用的环; 清除过程会耗费时间;内存碎片问题。
2. 复制式(Copying)
2.1 算法原理
复制式垃圾收集算法是一种改善标记扫描回收算法中不利于性能的算法,它将堆分成相等的两份 A 标记区和 B 标记区,每次只使用其中一个空间。
- 将"活动对象"放入新的空间;
- 清空原来的部分。
2.2 算法优缺点
- 优点:解决了内存碎片问题;执行效率更高。
- 缺点:只能使用堆内存的一半;内存占用率较高。
示例说明
在 Java中,垃圾回收器有四种:
- Serial GC 提供了一个单线程的收集机制,适用于应用程序的开发和调试工作,相对简单,开销最小。
- Parallel GC 是 Serial GC 扩展的多线程版本,将年轻代(Young Generation)和老年代(Old Generation)收集的线程同时执行。
- CMS GC 是一种被设计用于响应时间比吞吐量更重要的系统中,运行时,垃圾收集线程与用户线程相互并发执行。
- G1 GC(Garbage First Garbage Collector)首先只针对堆进行增量整理实现,这意味着 JVM 不需要在不同工作线程之间发送某个对象信息的标记,大规模地减少了业务暂停时间。
其中, Serial GC、Parallel GC、CMS GC 应用广泛。
// Example 1: Serial GC
java -XX:+UseSerialGC
// Example 2: Parallel GC
java -XX:+UseParallelGC
// Example 3: CMS GC
java -XX:+UseConcMarkSweepGC
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:常见的垃圾收集器算法有哪些? - Python技术站