1.什么样的对象需要回收?
- 对象到GC Roots没有引用链,那么这个对象不可用,需要回收
2.可作为GC Roots的对象?
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(Native方法)引用的对象
3.有哪些GC算法
标记-清除算法
- 标记所有要回收对象,标记完成后统一回收所有被标记对象
- 缺点是标记和清除两个过程效率低
- 而且清除之后会产生大量的不连续的内存碎片,导致分配较大对象时无法找到足够的连续内存空间,而提前触发另一次垃圾回收
复制算法
- 将内存分为大小相等的两块,每次只用其中一块,一块内存用完之后,将其中不需要回收的对象复制到另一块内存区域,然后将原来的半块内存区域全部回收
- 实现简单,效率高,但是将内存缩小为原来的一半,代价高。
- 大多数对象(98%)存活时间很短,不需要1:1划分两块区域
- 1块较大的Eden和2块较小的Survivor空间,每次使用eden和一块survivor,之后将存活的对象复制到另一块survivor区域里
- survivor空间不够需要老年代进行分配担保
标记-整理算法
- 标记需要回收对象,将存活对象移动到一端,然后将端边界以外的内存回收
分代收集算法(当前商业虚拟机采用的垃圾收集算法)
- 将堆分成新生代和老年代
- 新生代每次只有少量对象存活,用复制算法,只需付出复制少量存活对象的成本
- 老年代对象存活率高,用标记-清除或者标记-整理算法(没有额外空间进行分配担保)
4.Minor GC(Young GC),Full GC(Major Gc)
minor gc
full gc
- 经过minor gc之后存活的一部分对象会进入老年代,如果老年代剩余空间不足的时候会触发full gc