JavaGC机制

JVM内置有垃圾收集器:不需要我们程序员手动去申请,回收内存。
自动清除无用的对象,回收内存
下面先给出垃圾的定义; 内存中已经不再被使用到的空间就是垃圾。
java中判断对象是否存活的算法:

  • 引用计数法, 缺点 : 会存在循环引用问题
  • 可达性分析法, 实际使用的算法,判断该对象是否和 GC roots 存在一条引用链 , 枚举根节点可达性分析

那么可以作为GC Root的对象是:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI(即一般说的native方法)中引用的对象

判断是否对象是否存活之后,就要根据适当的内存回收算法回收垃圾对象,垃圾收集算法有:

  • 标记清除: 优点: 简单 缺点: 效率不高,内存碎片
  • 标记整理: 对标记清除后的内存碎片进行整理,效率不高
  • 复制算法: 可用内存减少
  • 分代收集: 新生代(复制算法), 老年代(标记清除,或标记整理)

JVM堆中实际的回收算法是以上回收算法的综合, 请注意:永久代(jdk1.8后变为了元空间)不参与垃圾回收,因此在这里不讨论
堆 :
JavaGC机制
`堆分为新生代和老年代, 新生代分为Eden, s0, s1 (分代收集)一个普通对象初始被创建时,会放入Eden区, 下一次GC
(轻GC)会把还存活的对象,移动到S0区(复制算法),再下一次GC还存活的对象,会放入S1区,反复经过15次后,还存活的对象,就会移动到老年代, 若老年代满了就会触发重GC(标记清除,标记整理

java中回收内存的 API: 当然 他们都是不靠谱的,具体回收时间由系统决定,我们无法显示指定。

  • Object的finalize方法, 垃圾收集器在回收对象时自动调用,有且仅被调用一次(不靠谱)
  • System的gc方法,运行垃圾收集器(不靠谱),无法对强引用回收