内存视角看垃圾回收器分类 :
1、young gc , 回收年轻代对象
2、old gc , 回收老年代对象
3、full gc , 回收整个堆的对象(包括年轻代、老年代)、方法区的永久代(8之后叫metaspace)
4、mixed gc , 回收部分年轻代和老年代
垃圾回收算法:
1、标记-清除算法 mark-sweep 标记阶段和清除阶段2部分构成。 标记阶段,对活着的对象做标记。 清除阶段,回收没有标记的对象。 不涉及对象移动,容易产生内存碎片,内存碎片需要单独的垃圾回收器进行回收。
2、复制算法 从coping 内存空间分为2块,from 和 to ,每次只使用一块,把存活的对象复制到另一块内存空间,然后回收整个空间。 一半的内存空间是浪费的。
jvm把新生代分为eden空间和survivor空间,survivor空间由2块组成 from 和 to。
urvivor 空间存放未被回收的对象。survivor 始终保持一个空间是空闲的。如果存活对象超过了
survivor空间的大小则需要另外的策略存储。 新对象,都是分配在Eden空间的,当回收时候将Eden和from移动到to空间。 新生代采用的回收策略就是采用复制算法,将Eden和survivor默认按照8:1分配。
3、标记-压缩算法(也叫标记-整理算法) mark-compact 标记阶段和压缩阶段2个阶段构成。 标记阶段,把存活的对象上做标记。 压缩阶段,所有存活的对象向一端移动,这样空闲空间在另一端,属于连续空间,不存在内存碎片。
4、分代算法 generational gc 根据对象的不同声明周期分别管理。jvm将堆内存分为新生代、老年代。 这样一来,可以对不同类型的对象采用不同的管理策略。 新生代,复制算法(新生代对象更新速度快)、 老年代,标记-清除-压缩算法 mark-sweep-compact(老年代中内存空间相对分配较大)
从几个视角对比回收算法:
| mark-sweep | copping | mark-compact | |
|---|---|---|---|
| 时间开销 | 中等 | 最快 | 最慢 |
| 空间浪费 | 不存在 | 存在 | 不存在 |
| 内存碎片 | 存在 | 不存在 | 不存在 |
| 移动对象 | 不存在 | 存在 | 存在 |
jvm 垃圾回收期分类 : 从回收方式视角
1、串行垃圾回收器 serial garbage collector
2、并行垃圾回收期 parallel garbage collector
3、并发标记描述垃圾回收期 cms garbage collector