分代垃圾回收算法整理

1. Ungar GC(分成两代):
新生代: GC 复制算法;
老年代: 对整个老年代空间执行GC标记-清除算法.
2. 多代GC:
【综合来看,少设置一些分代能得到更优秀的吞度量,据说分为2或3代是最好的】
2. Train GC:
新生代: GC 复制算法;

老年代: 对单个车厢(将老年代划分成固定大小的车厢)执行GC复制算法。


Train GC:


前提: 分配的对象都是比车厢小的。

优化ungar的分代垃圾回收算法,Richard L.Hudson和S. Eliot B. Moss发明了Train GC,即列车垃圾回收算法。同样的,Train GC也是将堆内存空间空间划分了新生代和老年代,对于老年代,Train GC将老年代空间按照一定大小,划分并按顺序连接(编了号)成一块块的小空间,有点类似于互相连接在一起的车厢。

各量列车和车厢分别有记录集记录了其连接关系

当执行新生代GC并有对象需要晋升到老年代空间时,需要将晋升的对象安排在已有的车厢或新的车厢内。在执行老年代GC时,开头列车的开头车厢【所以当前车厢的引用和被引用对象都在后面车厢或根,不会有前车】是GC的对象,这里会将该车厢内的几类内存数据做如下操作:
1. 根引用的数据放到一个新的车厢内;
2. 其它车厢引用到的数据复制过去[原则:将要复制的对象跟发出引用的对象安排在同一辆列车里]。
最后,回收这节车厢。

关于Ungar和Train GC的比较:

1. Ungar GC老年代的标记清除算法,增加了对象引用关系修改的时间,即停留时间[将整个老年代作为GC对象];
2. Train GC每一次老年代GC,仅仅回收很小的一部分[即一个车厢],可以缩短停留时间。
3. 一旦分配的内存大于车厢的大小,可能就要对这块数据不再使用车厢的算法。


这是 一年多前整理的,当时没发,躺在草稿箱一年了~~~~



### 垃圾回收算法的原理与实现 垃圾回收算法是一种基于对象生命周期特性的内存管理策略,它将堆内存划为不同的区域(),并针对不同采用不同的垃圾回收算法以提高效率。以下是垃圾回收算法的核心原理和实现方式。 #### 1. 原理 垃圾回收算法基于以下两个假设: - **弱世假设**:大多数对象很快就会变得不可达。即新生的对象通常存活时间较短[^2]。 - **强世假设**:如果一个对象存活了一段时间,那么它的存活概率会显著增加[^5]。 根据这两个假设,堆内存被划为新生(Young Generation)和老年(Old Generation)。新生用于存储新创建的对象,而老年则存放经过多次垃圾回收后仍然存活的对象。 #### 2. 新生与老年的划 - **新生(Young Generation)** 新生垃圾回收的主要目标区域,因为大部对象在此处创建并且很快成为垃圾。新生通常进一步划为 Eden 区和两个 Survivor 区(S0 和 S1)。对象首先配在 Eden 区,当 Eden 区满时触发 Minor GC,存活的对象会被复制到 Survivor 区,经历多次 GC 后仍然存活的对象会被晋升到老年[^3]。 - **老年(Old Generation)** 老年存放的是长期存活的对象。由于老年对象的存活率较高,因此通常使用标记-清除或标记-整理算法进行垃圾回收[^5]。 #### 3. 实现 垃圾回收算法的实现依赖于不同的垃圾回收器,常见的垃圾回收器包括 Serial、ParNew、Parallel Scavenge 等。以下是几种典型的实现方式: - **Serial 收集器** 单线程的垃圾回收器,适用于单核处理器或小型应用。它通过复制算法处理新生,并使用标记-整理算法处理老年。 - **ParNew 收集器** 多线程版本的 Serial 收集器,主要负责新生垃圾回收,通常与 CMS(Concurrent Mark-Sweep)收集器配合使用。 - **Parallel Scavenge + Parallel Old** 高效的多线程垃圾回收器组合,适用于追求高吞吐量的应用场景。Parallel Scavenge 负责新生垃圾回收,而 Parallel Old 负责老年垃圾回收。 #### 4. 示例码 以下是一个简化的伪码示例,展示如何实现垃圾回收的基本逻辑: ```python class GarbageCollector: def __init__(self): self.eden = [] self.survivor_0 = [] self.survivor_1 = [] self.old_gen = [] def allocate(self, obj): self.eden.append(obj) def minor_gc(self): surviving_objects = [obj for obj in self.eden if not self.is_garbage(obj)] for obj in surviving_objects: if obj.age > AGE_THRESHOLD: self.old_gen.append(obj) else: self.survivor_0.append(obj) self.eden.clear() def major_gc(self): surviving_old_objects = [obj for obj in self.old_gen if not self.is_garbage(obj)] self.old_gen = surviving_old_objects def is_garbage(self, obj): # 判断对象是否为垃圾 return False ``` #### 5. 总结 垃圾回收算法通过将堆内存划为新生和老年,并针对不同采用不同的垃圾回收算法,实现了高效的内存管理。这种算法利用了对象的生命周期特性,显著提高了垃圾回收的性能[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值