GC回收过程

Java的GC堆空间可分为年轻代(new Generation) 和年老代(old Generation), new Generation分为Eden, From, To区。其大小默认比例是8:1:1. 新的对象总是在Eden Space中被创建,当Eden区域满时,会触发Monitor GC, 这时会将仍在被使用的读写从Eden区copy到From区,然后清除Eden区;这样Eden区空了,新对象继续可在Eden中创建,当Eden再满时,触发Monitor GC把Eden和From区中仍然存活的对象copy到To区,然后清空Eden和From区;当Eden区再满时,触发Monitor GC把Eden和To区中仍然存活的对象copy到From区,然后清空Eden和To区。这样,new Generation中的对象,每熬过一次Monitor GC后仍然存活,则年龄+1岁,当他达到15岁还没有被GC,则他会升级到Old Generation中。当Old Generation区域满时,会触发Full GC, Full GC会对系统性能产生较大影响。所以,要根据系统特点,合理设置new Generation和old Generation的大小,尽量减少Full GC.
### JVM 分代垃圾回收(Garbage Collection, GC过程详解 #### 一、内存区域划分 JVM 的堆被划分为年轻代和老年代两个主要部分。年轻代又被进一步细分为 Eden 区域和两个 Survivor 区域 (S0 和 S1)[^1]。 #### 二、对象分配与晋升 新创建的对象通常会被放置到 Eden 区域中。当 Eden 区满时,触发 Minor GC 来清理该区内的无用对象,并将存活下来的对象移动至其中一个 Survivor 区(S0 或者 S1)。如果某个 Survivor 区也满了,则会把其中仍然活着的对象转移到另一个 Survivor 区;若此时仍有活下来却无法再迁移的对象,这些对象就会直接进入老年代[^2]。 #### 三、Minor GC 执行细节 在执行 Minor GC 过程中,除了上述提到的操作外,还会更新一些必要的数据结构来辅助后续的垃圾收集工作,比如记录跨代引用关系等信息以便于之后的老年带 Full GC 能够顺利进行[^3]。 #### 四、Full GC 发生条件及其操作 随着应用程序运行时间的增长,老年区内积累起越来越多难以轻易清除的大对象或长期存在的缓存数据等。一旦检测到老年代空间不足的情况发生时,便会启动一次完整的 Full GC 流程。这不仅涉及到了对整个堆内所有可达对象图遍历查找不可达节点并予以删除的动作,同时也包含了压缩整理剩余可用存储区间以防止碎片化现象加剧的任务[^4]。 ```java // Java代码示例:模拟对象分配行为 public class ObjectAllocation { public static void main(String[] args){ // 创建大量短生命周期的小型对象实例 for(int i=0;i<100000;i++){ new SmallObject(); } System.gc(); // 显式请求GC(不保证立即执行) } private static class SmallObject{ int data; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值