概述
在JVM中,实现了多种垃圾收集器,包括:串行垃圾收集器,并行垃圾收集器,CMS(并发)垃圾收集器,G1垃圾收集器;
1.串行垃圾收集器
串行(Serial)垃圾收集器,是指使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停,等待垃圾回收的完成。这种现象称之为STW
对于交互性较强的应用而言,这种垃圾收集器是不能够接受的;
一般在javaweb应用中是不会采用该 收集器的;
1.1 编写测试代码
public class Test01GC {
public static void main(String[] args) throws InterruptedException {
List<Object> list=new ArrayList<Object>();
while(true){
int sleep=new Random().nextInt(100);
if (System.currentTimeMillis()%2==0){
list.clear();
}else{
for (int i=0;i<10000;i++){
Properties properties=new Properties();
properties.put("key_"+i,"value_"+System.currentTimeMillis()+i);
list.add(properties);
}
}
Thread.sleep(sleep);
}
}
}
1.2 设置垃圾回收为串行收集器
-XX:+UseSerialGC -XX:+PrintGCDetails -Xms16m -Xmx16m
-XX:+UseSerialGC
指定年轻代和老年代都是用串行垃圾收集器
-XX:+PrintGCDetails
打印垃圾回收的详细信息
-Xms16m -Xmx16m
将堆的初始和最大内存都设置为16M
启动程序后,查看控制台输出的信息:
GC日志信息解读:
年轻代的内存GC前后的大小:
DefNew:表示使用的是串行垃圾收集器
4416K->512K(4928K):表示年轻代GC前,占有4416K内存,GC后,占有512K内存,总大小4928K
0.0040300 secs:表示GC所用的时间,单位为毫秒
9962K->7977K(15872K):表示GC前,堆内存占有9962K;GC后,占有7977K,总大小为15872K
Full GC:表示,内存空间全部进行GC
1.3 Serial Old收集器
Serial收集器的老年代版本,它同样是一个单线程收集器;
它的主要两大用途:
1.在jdk1.5以及以前的版本中与Parallel Scavenge收集器搭配使用;
2.作为CMD收集器的后备方案;
2.并行垃圾收集器
并行垃圾收集器在串行垃圾收集器的基础之上做了改进,将单线程改为了多线程垃圾回收,这样可以缩短垃圾回收的时间(这里是指,并行能力较好的机器);
当然,并行垃圾收集器在收集的过程中也会暂停应用程序,这个和串行垃圾回收器是一样的,只是并行执行,速度更快些,暂停的时间更短一些;
2.1 ParNew垃圾收集器
ParNew垃圾收集器是工作在年轻代上的,只是将串行的垃圾收集器改为了并行;
通过-XX:+UseParNewGC参数设置年轻代使用ParNew回收器,老年代使用的依然是串行收集器;
测试:
-XX:+UseParNewGC -XX:+PrintGCDetails -Xms16m -Xmx16m
控制台输出信息:
可以看出ParNew:使用的是ParNew收集器。其他信息和串行收集器一致;
2.2 ParallelGC垃圾收集器
ParallelGC收集器工作机制和ParNewGC收集器一样,只是在基础之上,新增了两个和系统吞吐量相关的参数,使得其使用起来更加灵活和高效;
测试:
-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=100 -XX:+PrintGCDetails -Xms16m -Xmx16m
参数说明:
-XX:+UseParallelGC
年轻代使用ParallelGC垃圾回收期,老年代使用串行回收器;
-XX:+UseParallelOldGC
年轻代使用ParallelGC垃圾回收期,老年代使用ParallelOldGC垃圾回收器;
-XX:MaxGCPauseMillis
设置最大的垃圾收集时的停顿时间,单位为毫秒;
需要注意的是,ParallelGC为了达到设置的停顿时间,可能会调整堆大小或其他的参数,如果堆的大小设置的较小,就会导致GC工作变得很频繁,反而可能会影响性能;
带参数使用需谨慎;
-XX:GCTimeRatio
设置垃圾回收时间啊占程序运行时间的百分比,公式为1/(1+n);
它的值为0~100之间的数字,默认值为99,也就是垃圾回收时间不能超过1%;
-XX:UseAdptiveSizePolicy
自适应GC模式,垃圾回收器将自动调整年轻代,老年代等参数,达到吞吐量,堆大小,停顿时间之间的平衡;
一般用于,手动调整参数比较困难的场景,让收集器自动进行调整;
控制台输出信息:
以上信息可以看出,年轻代和老年代都使用了ParallelGC垃圾回收器;
2.3 Parallel Scavenge收集器
Parallel Scavenge收集器类似于ParNew收集器;
Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)。CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消费耗时的比值。Parallel Scavenge收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量,如果对于收集器运行不大了解的话,手工优化存在的话可以选