GC垃圾回收算法和垃圾收集器的关系?
GC算法(标记清除、复制、标记清除、标记整理)是内存回收的方法论,垃圾收集器就是算法落地实现。没有完美的收集器,更没有万能的收集器,针对具体应用选择适合的收集器。
4种主要垃圾收集器
Serial、Parallel、CMS、G1(java10之前,之后还有新的)
-
Serial:它为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有用户线程,所以不适合服务器环境;
-
Parallel:多个垃圾收集器线程并行工作,此时线程是暂停的,适用于科学计算、大数据处理首台处理等弱交互场景,性能比Serial好;
-
CMS:用户线程和垃圾收集线程同时执行(不一定并行,可能交替执行),不需要停顿用户线程,互联网公司多用它,适用对响应时间有要求的场景,即强交互场景
上述总结:在单核CPU下并行可能更慢;串行和并行都会产生STW,Concurrent更加复杂,GC可能会占用CPU
-
G1:Garbage First,java9开始默认使用G1,G1垃圾收集器将堆内存分割成不同的区域然后并发的对其进行垃圾回收
查看默认垃圾收集器
java -XX:+PrintCommandLineFlags -version
默认的垃圾收集器有哪些(7-1)
- UseSerialGC
- UseSerialOldGC(淘汰)
- UseParallelGC
- UseConcMarkSweepGC
- UseParNewGC
- UseParallelOldGC
- UseG1GC
垃圾收集器(重点)
//测试时配置公共参数:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags
//再加上某个垃圾收集器的开启参数,下面有介绍
public class GCDemo {
public static void main(String[] args) {
System.out.println("GC hello!!");
try{
String str = "test";
while (true){
str += str + new Random().nextInt(77777777)+new Random().nextInt(88888888);
str.intern();
}
} catch (Throwable e){
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
部分参数预先说明
DefNew:Default New Generation
Tenured:Old
ParNew:Parallel new Generation
PSYoungGen:Parallel Scavenge
ParOldGen:Parallel Old Generation
Server/Client模式分别是什么意思?
掌握Server模式即可,Client模式基本不会用
32位Windows操作系统不论硬件如何都默认使用JVM的Client模式;32位其他操作系统,2G内存同时有2个CPU以上用Server模式,低于该配置还是Client模式;64位only Server模式。
-
串行SerialGC
一个单线程的收集器,在进行垃圾回收的时候,必须暂停其他所有的工作线程直到它收集结束。
最古老、最稳定、效率最高的收集器。对于单核CPU来说即java虚拟机运行在Client模式下的新生代垃圾收集器。
-XX:+UseSerialGC开启后会使用Serial+SerialOld的收集器组合,表示新生代、老年代都会使用串行回收收集器,新生代使用复制算法,老年代使用标记整理算法 -
并行ParallelGC
使用多线程进行垃圾回收,在进行垃圾收集的时候,会stw暂停其他所有的工作进程必须等它收集完成,老年代仍然用串行。相当于Serial并行多线程版本,使用时常配合老年代CMS工作。它是很多java虚拟机运行在Server模式下新生代的默认垃圾收集器
-XX:+UserParNewGC 启用ParNew,只影响新生代收集,不影响老年代收集,开启参数后,会使用ParNew+SerialOld的收集器组合,新生代复制算法,老年代标记-整理算法,但是ParNew+Tenured这样的搭配。java8已经不再被推荐
java HotSpot™ 64-Bit Server VM warning:
Using the ParNew young collector with the Serial old collector is deprecated and will likely be removed in a future release
ps.-XX:ParallelGCThreads 限制线程数量,默认开启和CPU数目相同的线程数 -
并行回收ParallelGC
java8默认,Parallel Scavenge收集器类似ParNew也是一个新生代的垃圾收集器,使用复制算法,也是一个并行的多线程垃圾收集器,俗称吞吐量优先收集器。一句话:串行收集器在新生代和老年代的并行化
它重点关注的是:
①可控制的吞吐量,高吞吐量意味着高效利用CPU的时间,它多用在后台运算而不需要太多交互的任务。thoughput = 运行用户代码时间/(运行用户代码时间+垃圾收集时间)
②自适应调节策略也是ParallelScavenge收集器与ParNew的一个重要区别。(自适应调节策略:虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间-XX:MaxGCPauseMills或最大吞吐量)
可以用-XX:+UseParallelGC或-XX:+UseParallelOldGC相互激活 -
ParallelOld收集器
是ParallelScavenge的老年代版本,使用多线程的标记-整理算法,1.6才开始提供,之前ParallelScavenge搭配老年代SerialOld收集器,只能保证新生代吞吐量优先,无法保证老年代吞吐量。ParallelOld解决这个问题。
-XX:+UseParallelOldGC -
并发标记清除(CMS)收集器
是一种以获取最短回收停顿时间为目标的收集器。适合应用在互联网站或者B/S系统的服务器上上,这类应用尤其注重服务器的响应速度,希望系统停顿时间最短。CMS非常适合堆内存大、CPU核数多的服务端应用,也是G1出现之前大型应用的首选收集器。
Concurrent Mark Sweep 并发标记清除,并发收集低停顿,并发只的是与用户线程一起执行
开启参数:-XX:+UseConcMarkSweepGC
开启之后young区对应使用ParNew,如果old区CMS失败会用SerialOld后备。
CMS的4步过程:
①初始标记(CMS initial mark):只是标记一下GCRoots能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。
②并发标记(CMS concurrent mark):和用户线程一起,不需要暂停工作线程。主要标记过程,标记全部对象
③重新标记(CMS remark):为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程,正式清理前要做修正
④并发清除(CMS concurrent sweep):和用户线程一起,清除GC Roots不可达对象,不需要暂停工作线程。基于标记结果,直接清理对象,由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户线程一起工作,所以总体上来看CMS收集器的内存回收和用户线程是一起并发地执行。
优点:并发收集低停顿
缺点:并发执行CPU压力大,CMS收集和工作线程同时会增加对堆内存的占用,也就是说,CMS必须在老年代堆内存用尽之前完成垃圾回收,否则CMS回收失败时,将触发担保机制串行老年代收集器将会以STW的方式进行一次GC,从而造成大停顿时间;标记清除会产生大量内存碎片。 -
SerialOld收集器
Serial老年代版本,标记整理算法,Client模式下,在jdk1.5前与新生代ParallelScavenge配合使用;作为老年代中使用CMS收集器的后备方案。 -
G1收集器
详见01-024 【jvm】垃圾收集器之G1垃圾收集器.
如何选择垃圾回收器?
组合的选择:
单CPU或者小内存,单机程序
-XX:+UseSerialGC
多CPU,需要最大吞吐量,如后台计算型应用
-XX:+UseParallelGC或者-XX:+UseParallelOldGC
多CPU,追求低停顿时间,需要快速响应的互联网应用
-XX:+UseConcurrentMarkSweepGC
-XX:+UseParNewGC
总结
参数 | 新生代垃圾收集器 | 新生代算法 | 老年代垃圾收集器 | 老年代算法 |
---|---|---|---|---|
-XX:+UseSerialGC | SerialGC | 复制 | SerialOldGC | 标记整理 |
-XX:+UseParNewGC | ParNew | 复制 | SerialOldGC | 标记整理 |
-XX:+UseParallelGC/-XX:+UseParallelOldGC | ParallelScavenge | 复制 | ParallelOld | 标记整理 |
-XX:+UseConcurrentMarkSweepGC | ParNew | 复制 | CMS+SerialOld组合 | 标记清除 |
-XX:+UseG1GC | G1整体上采用标记-整理算法 | 局部是通过复制算法,不会产生内存碎片。 |
学习整理于面试题.