1、Serial 单线程收集器
启用命令 java -XX:+UseSerialGC
使用该收集器,会导致系统暂停,但是该收集器占用内存空间比较小,是JAVA开发嵌入式程序时首选的收集器
2、Parallel 多线程收集器
收集老年代垃圾 java -XX:+UseParallelGC
收集新生代垃圾 java -XX:+UseParallelGC
该收集器是JVM默认收集器,使用时也会造成应用程序暂停,但是该收集器和Serial的区别是,该收集器会启用多线程执行收集,同时支持各种JVM命令进行配置,配置命令如下:
-XX:ParallelGCThreads=<N> ---配置吞吐量 -XX:MaxGCPauseMillis=<N> ---程序总暂停时间 -XX:GCTimeRatio=<N> ---GC占用时间比例 -Xmx<N> ---内存占用
3、CMS 多线程收集器(JK8后已废除,不需要熟悉)
CMS垃圾收集器与应用程序并行运行。对于新生代和老年代都使用了多线程
4、G1 收集器(JK8后代替CMS收集器)
启用命令 java -XX:+UseG1GC
面试最爱问,G1通过多线程标志多个大小相同的内存区域,标志完成后,G1收集器知道哪一些区域里大部分为空闲,即进行清空/删除,在 G1 收集器中,一个对象如果大小超过半个区域容量会被认为是一个“大对象” 。这些对象被放置在老年代中
由于现在大部分企业使用JK8进行面试,以下收集器了解即可
5、Epsilon 收集器(JDK11后引入,了解即可)
启用命令 java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
它不做任何实际的内存回收,只负责管理内存分配。Epsilon 只在当你知道应用程序的确切内存占用情况并且不需要垃圾回收时使用。启用命令如下:
6、Shenandoah 收集器(JDK12后引入)
启用命令:java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
它会进行内存压缩,立即删除无用对象并释放操作系统的空间。所有的这一切与应用程序线程并行发生。
7、ZGC 收集器
启用 ZGC :java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
ZGC 为低延迟需要和大量堆空间使用而设计,允许当垃圾回收器运行时 Java 应用程序继续运行。ZGC 收集器在 JDK11 引入,在 JDK12 改进。在 JDK15后,正式脱离测试阶段投入使用