深入理解GC的原理、算法及选择策略

本文深入探讨了Java垃圾收集(GC)的背景和基本原理,详细介绍了包括引用计数法、标记清除、标记-复制和标记-清除-整理在内的各种GC算法。同时,讨论了GC在不同堆区的应用策略,如年轻代的Young GC和老年代的Full GC。文章还分析了串行GC、并行GC、CMS GC和G1 GC等执行策略,以及它们的优缺点和STW停顿时间的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.GC的背景及基本原理

核心观点
1)GC的出现本质上是内存资源的局限性
2)Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。
java内存模型
在这里插入图片描述
3)线程栈的内存分配在编译期大致可知,这部分内确定性,无需考虑如何回收
4)Java的堆和方法区(从Java8开始被Metaspace代替)有着很显著的不确定性,这部分是在运行时动态变化的,这部分的内存分配和回收是动态的,堆中存放的就是对象,需要对于已经死亡的对象进行清理和回收,以保证腾出空间给其他对象使用,这就是GC干的活

2 GC的典型的几种算法

首先来看下是堆内存结构
在这里插入图片描述
1)堆内存是所有线程共用的内存空间,JVM 将Heap 内存分为年轻代(Young generation)和 老年代(Old generation, 也叫 Tenured)两部分。
2)年轻代还划分为 3 个内存池,新生代(Edenspace)和存活区(Survivor space), 在大部分GC 算法中有 2 个存活区(S0, S1),在我们可以观察到的任何时刻,S0 和 S1 总有一个是空的, 但一般较小,也不浪费多少空间。Non-Heap 本质上还是 Heap,只是一般不归 GC
管理,里面划分为 3 个内存池。Metaspace, 以前叫持久代(永久代, Permanentgeneration), Java8 换了个名字叫 Metaspace。
GC的算法演进以及基于堆内存划分的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值