垃圾回收器
垃圾收集器是垃圾回收的实际实现者,垃圾回收算法是方法论。
垃圾回收器分类
按线程数量:
1.单线程垃圾回收器:只有一个线程进行垃圾回收,使用于小型简单的使用场景,垃圾回收时,其他用户线程会暂停
Serial Serial old
2.多线程垃圾回收器:多线程垃圾回收器内部提供多个线程进行垃圾回收,在多 cpu 情况下大大提升垃圾回收效率,但同样也是会暂停其他用户线程
Parallel
按照工作模式分:
1.独占式:垃圾回收线程执行时,其他线程暂停
2.并行式:垃圾回收线程可以和用户线程同时执行(某些阶段)
按工作的内存区间分:
1.年轻代垃圾回收器
2.老年代垃圾回收器
垃圾回收性能指标
用户线程的暂停时间;垃圾回收时,用户线程暂停的时间
吞吐量:用户代码运行时间占总时间的比例(总运行时间为用户代码运行时间加垃圾回收时间)
回收的速度;
占用内存的大小;
CMS垃圾回收器
Concurrent Mark Sweep 并发标记清除,作用于老年区
支持垃圾回收线程与用户线程并发(同时)执行
初始标记:独占式的暂停用户线程
并发标记:垃圾回收线程与用户线程并发(同时)执行
重新标记:独占式的暂停用户线程
并发清除:垃圾回收线程与用户线程并发(同时)执行 进行垃圾对象的清除
优点:可以做到并发收集
弊端:使用标记清除算法,会产生内存碎片,并发执行影响到用户线程,无法处理浮动垃圾
三色标记
由于CMS有并发执行过程,所以在标记垃圾对象时,有不确定性,现有的引用链可能会发生改变,不稳定
所以在标记时,将对象分为3种颜色(3种状态)
黑色:该对象已经被标记过了,且该对象下的属性也全部被标记过了(例如GCRoots对象)
灰色:在黑色对象中关联的对象,其中还有未扫描完的,之后还需要在次进行扫描
白色:与黑色、灰色对象无关联的,垃圾收集算法不可达的对象,成为垃圾,被回收
标记过程:
1.先确立GCRoots,将其标记为黑色
2.与GCRoots关联的对象标记为灰色
3.此时不再遍历黑色,而再次遍历灰色,灰色变为黑色,若灰色下面有关联的对象,则关联的对象变为灰色。
4.最终保留黑色,灰色,回收白色对象
标记过程中,可能会出现漏标,错标现象;
G1回收器() 垃圾优先
将堆内存各个区有分成较小的多个区域,对这些个区域进行检测,对某个区域中垃圾数量大的区域优先回收。
也是并发收集的。
查看JVM垃圾回收器并设置垃圾回收器
注:这些指令是为每个方法设置的,点击编程工具的Run选项的Edit Configurations,在其中的VM options中输入命令,应用后,我们再次运行此方法即可。
打印默认垃圾回收器
-XX:+PrintCommandLineFlags -version
JDK 8 默认的垃圾回收器
年轻代使用 Parallel Scavenge GC
老年代使用 Parallel Old GC
打印垃圾回收详细信息
-XX:+PrintGCDetails -version
设置默认垃圾回收器
Serial 回收器
-XX:+UseSerialGC 年轻代使用 Serial GC, 老年代使用 Serial Old GC
ParNew 回收器
-XX:+UseParNewGC 年轻代使用 ParNew GC,不影响老年代。
CMS 回收器
-XX:+UseConcMarkSweepGC 老年代使用 CMS GC。
# G1 回收器
-XX:+UseG1GC 手动指定使用 G1 收集器执行内存回收任务。
-XX:G1HeapRegionSize 设置每个 Region 的大小。