1 复制算法:新生代(MinorGC)
复制->清空->互换。
复制:当伊甸区满的时候会触发第一次gc,把还活着的对象拷贝到from区,当eden区再次触发gc的时候会扫描eden和from两个区进行垃圾回收,经过这次,回收还存活的对象进入to区或者老年代(年龄>=15)。同时把这些对象年龄+1
清空:然后清空eden和from区的对象,
互换:from区变为to区,to区变为from区
新生代采用复制算法的原因是新生代的对象大都是朝生夕死,需要复制的对象占少数。
优点
- 整体复制,不会产生内存碎片。
- 实现简单,运行高效
缺点
- 比较占用内存空间,有些大对象复制比较耗时。
- 会浪费部分内存空间(to区总是为空的)
2 标记清除算法
标记->清除,先标记出需要回收的对象然后统一清除
优点:节约内存空间
缺点:产生内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不触发另一次垃圾收集动作
3 标记整理算法
标记->移动->清除
该算法标记的过程与标记—清除算法中的标记过程一样,但对标记后出的垃圾对象的处理情况有所不同,它不是直接对可回收对象进行清理,而是让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。在老年代中,对象存活率比较高,比较适合标记整理算法
优点:节约内存空间,不会产生碎片
缺点:需要移动对象的成本
4 垃圾确定方式
根搜索算法:通过一些被称为引用链(GC Roots)的对象作为起点,从这些节点开始向下搜索,搜索走过的路径被称为(Reference Chain),
当一个对象到GC Roots 没有任何引用链相连时(即从 GC Roots 节点到该节点不可达),则证明该对象是不可用的。
GC Root对象:
- 虚拟机栈(栈帧中的本地变量表)中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象