垃圾回收器负责回收所有“不可达”对象的内存空间即没有使用的内存空间
垃圾回收算法一般要做两件基本事情:
1. 发现无用的对象
2. 回收无用对象占用的内存空间
垃圾回收机制保证可以将“无用的对象进行回收”,无用的对象指没有任何变量引用该对象。
垃圾回收相关算法
- 引用计数法:堆中每一个对象都有一个引用计数,被引用一次计数+1,被引用变量值为null计数-1,直到计数为0,则成为无用对象。优点是算法简单,缺点是循环引用的无用对象无法被识别。
- 引用可达法(根搜索算法):把所有引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的节点寻找完毕,剩余的节点则被认为是没有被引用到的节点,即无用的节点。
分代垃圾回收机制
- 年轻代(Eden):对应Minor GC,每次Minor GC会清理年轻带的内存,算法采用效率较高的复制算法,频繁操作但是会浪费内存空间,当年轻代区域存放满对象后,就将对象存放到老年代区域。
- 年老代(Survivor):老年代越来越多会启用Major GC和Full GC(全量回收)来一次大扫除,全面清理年轻带区域和老年代区域
- 持久代(Tenured/old):用于存放静态文件、java类、方法等,持久代对垃圾回收没有影响。
垃圾回收过程
- 新创建的对象,绝大多数会存储在Eden中
- 当Eden满了或达到一定比例后不能创建新对象,则触发垃圾回收机制(GC),将无用对象清理掉,然后剩余对象复制到survivor中,加入s1区域。
- 当Eden中再次满了,会将s1中不能清空的对象再存到另一个survivor区域比如s2,同时将Eden中不能清空的对象复制到s1中
- 重复多次Survivor中没有被清理的对象时,则会复制到老年代Old区中
- 当Old区满了,则会触发一次完整的垃圾回收(Full GC)