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

    • 新生代上的gc,当新生代的eden区满时触发
  • full gc

    • 经过minor gc之后存活的一部分对象会进入老年代,如果老年代剩余空间不足的时候会触发full gc

results matching ""

    No results matching ""