一、由谁来做?
Java的垃圾回收是由JVM(Java虚拟机)来做的
二、什么时候做?
1)CPU空闲的时候,自动进行回收;
2)在堆内存存储满了之后,自动进行回收
3)程序调用System.gc()主动尝试进行回收。
三、怎么做?
1)先找到垃圾对象:
判断垃圾对象的算法主要有:
A、引用计数法:类似给对象添加引用计数器,每次引用,计数器+1,每次失效引用,计数器-1,任何时候计数器为0的对象,就是垃圾对象
B、可达性分析算法:(还没有理解透彻,后续补充)
2)再收集清除垃圾对象
算法主要有:
A、标记清除法:最基础的收集算法,分为“标记”,“清除”二个阶段;
B、复制算法;
C、标记整理法;
D、分代收集算法:当前JVM的垃圾收集大都采用分代收集算法。即根据对象的新老特点,采取合适的垃圾收集算法。
将Java堆对象分为新生代和老年代,在新生代中,每次收集都会有大量对象死去,故可以采用“复制算法”。
在老年代中,对象的存活率高,故可以采取“标记清除法”和“标记整理算法”。
补充解释:
新生代:一般存放新生成的,或者说朝生夕死的对象;
老年代:一般存放生命周期较长的对象,在新生代中,经历了N次垃圾回收后仍然存活的对象,都将进入老年代;
永久代:主要存放静态文件,Java类,方法等,永久代对垃圾的回收没有什么影响。