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的算法演进以及基于堆内存划分的

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

被折叠的 条评论
为什么被折叠?



