GC的作用
简单点说,JVM中的GC会不定时去堆内存中清理不可达对象。
GC的工作特点
在GC工作中,通过某种算法来对JVM中的内存区域进行检测,对检测到的不可达对象,进行垃圾回收。理论上GC过程中会频繁收集Young区,很少收集Old区,基本不动Perm区(元空间/方法区)。
垃圾回收方式
垃圾的回收方式有:清除、压缩和复制
清除(sweep),即把死亡对象所占据的内存标记为空闲内存,并记录在一个空闲列表(free list)之中。当需要新建对象时,内存管理模块便会从该空闲列表中寻找空闲内存,并划分给新建的对象。
压缩(compact),即把存活的对象聚集到内存区域的起始位置,从而留下一段连续的内存空间。这种做法能够解决内存碎片化的问题,但代价是压缩算法的性能开销。
复制(copy),即把内存区域分为两等分,分别用两个指针 from 和 to 来维护,并且只是用 from 指针指向的内存区域来分配内存。
垃圾回收算法
垃圾回收算法有:标记复制(Mark-Copying)算法、标记清除(Mark-Sweep)算法、标记压缩(Mark–Compact)算法和标记清除压缩(Mark-Sweep-Compact)算法。
标记复制(Mark-Copying)算法将 Survivor 区中的老存活对象晋升到老年代,然后将剩下的存活对象和 Eden 区的存活对象复制到另一个 Survivor 区中。理想情况下,Eden 区中的对象基本都死亡了,那么需要复制的数据将非常少,因此采用这种标记 - 复制算法的效果极好
标记清除算法一般应用于老年代,因为老年代的对象生命周期比较长。该算法先对所有可访问的对象,做个标记再遍历堆,把未被标记的对象回收(标记活的)。
标记清除算法和标记压缩算法非常相同,但是标记压缩算法在标记清除算法之上解决内存碎片化。
标记清除压缩(Mark-Sweep-Compact)算法是标记清除算法和标记压缩算法的结合算法。其原理和标记清除算法一致,只不过会在多次GC后,进行一次Compact操作。