垃圾回收器是垃圾回收算法的落地实现,但是还没有一种最好的垃圾回收器,所以现在只能针对应用去选择适合的垃圾回收器,进行分代收集。
四种垃圾回收的方式:Serial、Parallel、CMS、G1
Serial(串行)
串行垃圾收集器,是为单线程环境设计的、使是用一个线程进行垃圾回收,并且回收时,会暂停所有的服务,可想而知,它并不适合服务器环境。
Parallel(并行)
并行是对串行在为了适应服务器的一种提升。本来是一个人清理垃圾,然后现在多个人清理,会使得清理速度成倍的提升。适用于科学计算/大数据处理
两者的对比图:
不太清楚?再来一张:
CMS并发垃圾收集
用户线程和垃圾回收线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程互联网公司大多用它,适用对响应时间有要求的场景。
一边执行程序,一边清理数据。
G1
将堆内存分割成不同的区域,然后对其并发的进行垃圾回收。
接下来说说怎样查看默认垃圾收集器,及如何配置
1、查看
java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
开始就说了四种垃圾回收的方式,那么再说说java中的垃圾回收器有哪些吧。
推荐大家看jvm垃圾收集(以下图片皆为此处转载) 还有 垃圾收集器
java的gc回收类型主要有7种。
Serial:新生代和老年代都使用串行回收器,新生代使用复制算法,老年代使用标记-整理算法。
SerialOld:已被废弃。
UseParNewGC:ParNew收集器是Serial收集器的多线程版本,使用这个参数后会在新生代进行并行回收,老年代仍旧使用串行回收。新生代S区仍然使用复制算法。
Parallel:新生代使用Parallel收集器,老年代使用串行收集器。
ParallelOld:新生代和老年代都使用并行收集器。打印出的GC会带PSYoungGen、ParOldGen关键字
ConcMarkSweep:并发标记清除,即使用CMS收集器。
G1:
当然这些都可以通过配置参数,进行使用。
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelGC :新生代使用并行回收收集器,更加关注吞吐量
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:+UseG1GC:启用G1垃圾回收器
配置
配置参数的格式:它们是XX参数的Boolean类型。
即-XX:+参数
在这里进行配置:
布尔类型。+为启用
关于如何选择: