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