Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,不同的版本和不同的收集群可以针对不同的场景需要,最新的并不意味就是最好的,有时候在架构和业务层面考虑,可以根据需要进行配置。接下来介绍垃圾收集器的分类,方面你了解怎么为项目选择合适的垃圾收集器。想学习的同学,建议参加千锋重庆java学习
1.串行垃圾收集器
串行垃圾收集器使用单个线程来执行所有垃圾收集工作,这使得它相对高效,因为线程之间没有通信开销。
它最适合于单处理器机器,因为它不能利用多处理器硬件,尽管它在多处理器上对具有小数据集的应用程序很有用。串行垃圾收集器在某些硬件和操作系统配置上默认选择,或者可以使用选项-XX:+UseSerialGC显式启用。
串行GC将是不具有低暂停要求且在非常小的堆大小上工作的应用程序的最佳选择。
2.并行垃圾收集器
并行垃圾收集器也称为吞吐量收集器,是与串行垃圾收集器类似的分代收集器。串行垃圾收集器和并行收集器之间的主要区别在于并行收集器具有多个线程,用于加速垃圾收集。
并行垃圾收集器适用于具有在多处理器或多线程硬件上运行的中型到大型数据集的应用程序。您可以使用-XX:+UseParallelGC选项启用它。
并行压缩是一种使并行垃圾收集器能够并行执行主要收集的功能。在没有并行压缩的情况下,主要收集是使用单个线程执行的,这会极大地限制可伸缩性。如果已指定选项-XX:+UseParallelGC,则默认情况下启用并行压缩。您可以使用-XX:-UseParallelOldGC选项禁用它。
并行垃圾收集器将是吞吐量比延迟更重要的最佳选择。在可以接受长暂停的情况下,可以使用并行垃圾收集器,例如批量数据处理或批处理作业。
3.并发垃圾收集器
并发标记扫描(CMS)收集器和垃圾优先(G1)垃圾收集器是两个主要并发的收集器。这些收集器与应用程序并行执行一些昂贵的工作,因此它们大多被称为并发收集器。
CMS收集器
CMS收集器在需要低垃圾收集暂停的应用程序环境中是首选的,并且可以在应用程序运行时与垃圾收集器共享处理器资源。当应用程序中的长寿命世代较高时,或者在有两个或多个处理器的机器上运行时,此收集器基本上提供了更多的好处。CMS收集器可以通过选项-XX:+UseConMarkSweepGC启用。
CMS收集器在JDK 9中不再受欢迎,建议使用垃圾优先(G1)收集器。
G1垃圾收集器
G1是用于具有大量内存的多处理器机器的服务器样式收集器。它以很高的概率满足垃圾收集暂停时间目标,同时在不需要配置的情况下实现高吞吐量。默认情况下,在某些硬件和操作系统配置上选择G1,或者可以使用-XX:+UseG1GC显式启用G1。
G1主要通过疏散来回收空间:在要收集的选定内存区域中找到的活动对象被复制到新的内存区域,并在此过程中进行压缩。疏散完成后,先前由活动对象占用的空间将被应用程序重新分配。
对于高级语言来讲,因为不断的创建对象,如果不清理,迟早内存会满。所以需要清理不要的垃圾。了解这些垃圾收集器的特性有助于你为开发项目选择合适的垃圾收集器,保障程序正常运行。