一、垃圾回收过程:
1、发现无用的对象
2、回收无用对象占用的内存空间
垃圾回收机制保证可以将“无用的对象”进行回收。无用的对象指的就是没有任何变量 引 用该对象。Java 的垃圾回收器通过相关算法发现无用对象,并进行清除和整理
二、垃圾回收相关算法
1、引用计数法
堆中的每个对象都对应一个引用计数器,当有引用指向这个对象时,引用计数器加 1,而当指向该对象的引用失效时(引用变为 null),引用计数器减 1,最后如果该 对象的引用计算器的值为 0 时,则Java 垃圾回收器会认为该对象是无用对象并对其 进行回收。优点是算法简单,缺点是“循环引用的无用对象”无法别识别
2. 引用可达法(根搜索算法)
程序把所有的引用关系看作一张图,从一个节点 GC ROOT 开始,寻找对应的引用 节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找 完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点
三、通用的分代垃圾回收机制
·Minor GC: 用于清理年轻代区域。Eden 区满了就会触发一次 Minor GC。清理无用对象,将有用 对象复制到“Survivor1”、“Survivor2”区中。
·Major GC: 用于清理老年代区域。
·Full GC: 用于清理年轻代、年老代区域。 成本较高,会对系统性能产生影响
导致Full GC:
1. 年老代(Tenured)被写满
2. 持久代(Perm)被写满
3. System.gc()被显式调用
4. 上一次 GC 之后Heap的各域分配策略动态变化
其他要点
1. 程序员无权调用垃圾回收器。
2. 程序员可以调用 System.gc(),该方法只是通知 JVM,并不是运行垃圾回收器。尽量少用,会申请启动 Full GC,成本高,影响系统性能
3. finalize 方法,是 Java 提供给程序员用来释放对象或资源的方法,但是尽量少用