jvm 垃圾回收算法
垃圾回收算法:
-
标记清除
- 先扫描堆空间,没有GC root引用的对象进行标记垃圾;
- 清除垃圾【对垃圾的起始、结束位置进行记录】;
- 速度快,容易产生碎片内存空间;
-
标记整理:
- 先扫描堆空间,没有GC root引用的对象进行标记垃圾;
- 整理空间,将活动空间已经移动到连续空间;
- 克服碎片化空间,低效率;
-
复制算法:
- 将内存空间分为两片,一个是所有活动对象From,另一个没有对象To;
- 先扫描堆空间,没有GC root引用的对象进行标记垃圾;
- 通过copy到另一片空间,实现数据整理,然后交换两片空间;
- 需要占用双倍内存空间;
实际的垃圾回收算法,是综合考虑使用上面三种算法;
分代垃圾回收机制
- 将堆内存划分为:
- 新生代【生命周期短的对象】:
- 伊甸园【乐园】:
- 新产生对象默认生产在伊甸园;
- 当伊甸园满了后,触发Minor GC,并且采用复制算法,复制到幸存区 TO,并且幸存对象寿命标记+1【在伊甸园是 0,每经历过一次Minor GC 加1】;
- 并且将幸存区To重名为幸存区From,将幸存区From重名为幸存区To;
- 当伊甸园第二次满后,将伊甸园和幸存区from,使用复制算法,复制到幸存区TO,并将幸存对象,寿命标记+1,然后交换幸村区命名;
- Minor GC会触发stop the world,暂停其他用户线程,等待垃圾回收结束,线程在恢复运行;
- 幸存区 From;
- 当幸存区From内的对象的寿命值,超过一个阈值【15,4bit】,则将该对象晋升到老年代空间,不同垃圾回收器,阈值不一样;
- 当新生代空间不足的时候,可以直接将大对象晋升到老年代,而不会触发Minor GC;
- 幸存区To
- 伊甸园【乐园】:
- 老年代【生命周期长的对象】:
- 当老年空间不足时候,首先尝试触发Mnior gc,如果之后空间仍不足,那么触发ful gc,full gc 的stop the world【STW】的时间更长,如果还不足,则报错:OutOfMemoryError;
- 当在一个子线程内因为内存不足,报错,不会影响其他线程程序进程;
- 新生代【生命周期短的对象】:

浙公网安备 33010602011771号