分代回收算法

对于不同的对象,生命周期大都不同,所以对于不同生命周期的对象需要大致分类成两大类:

  1. 存活时间较短的对象,需要大量的回收
  2. 存活时间比较长的对象,需要相对少的回收,但是对象较多

对于不同特征的对象,我们需要采用不同的算法对具有该特征的对象集合进行回收,这就是分代回收算法

1、新生代

新建的对象此时此刻还是一个初出茅庐的小伙子,踏进堆中发现一个8:1:1的空间,最大的空间我们把它叫做Eden,两个小的空间我们都叫Survivor,他发现这里的垃圾是这样回收的

这就是标记复制算法
这就是标记复制算法
这就是标记复制算法

2、年老代

经历过15次(默认阈值,可以通过参数-XX:MaxTenuringThreshold调整)标记复制算法还存活下来的对象或者是在Survivor中相同年龄的对象总体积超过Survivor一半区域时,大于等于该年龄的对象直接晋升到老年代,无须等到MaxTenuringThreshold中要求的年龄,就会将把它们放到年老代中
还有一种情况,如果对象大小大于-XX:PretenureSizeThreshold参数设置的值,即被视为大对象,将会直接在年老代创建(所以说不是所有新建的对象都是从新生代开始的)
这时候发现年老代的空间是新生代的两倍,这里有可能出现两种不同的垃圾回收算法

这就是标记清除算法
这就是标记清除算法
这就是标记清除算法,可以通过图片清楚的看到内存碎片的产生,由于内存地址的不连续,导致连续可用内存大大的减少,以下是优化后的算法
这就是标记整理算法
这就是标记整理算法
这就是标记整理算法

3、永久代

永久代一般都是存放一些静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类

Minor GC:发生在新生代的算法
Major GC:发生在年老代或者永久代的算法
Full GC:Minor GC+Major GC

### 分代垃圾回收算法的原理与实现 分代垃圾回收算法是一种基于对象生命周期特性的内存管理策略,它将堆内存划分为不同的区域(代),并针对不同代采用不同的垃圾回收算法以提高效率。以下是分代垃圾回收算法的核心原理和实现方式。 #### 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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值