Java的四种垃圾收集器
串行式垃圾收集装置
平行垃圾收集器
CMS垃圾收集器
G1垃圾收集器
这四种类型中的每一种都有其自身的优点和缺点。最重要的是,我们程序员可以选择要由JVM使用的垃圾收集器的类型。我们可以通过将选择作为JVM参数来选择它们。这些类型中的每一种在很大程度上不同,并且可以提供完全不同的应用性能。认识到这些类型的垃圾收集器是非常关键的,并且基于应用正确地使用这些类型的垃圾收集器是非常关键的。
1、串行式垃圾收集装置
串行垃圾收集器通过保存所有应用程序线程来工作。它是针对单线程环境而设计的。它只使用一个用于垃圾收集的线程。在进行垃圾收集时冻结所有应用程序线程的方式可能不适合于服务器环境。它最适合简单的命令行程序。
打开 -XX:+UseSerialGC 使用串行垃圾收集器的JVM参数。
2、平行垃圾收集器
并行垃圾收集器也称为吞吐量收集器。它是JVM的默认垃圾收集器。与串行垃圾收集器不同,这使用多个线程进行垃圾收集。类似于串行垃圾收集器,这也冻结了所有应用程序线程,同时执行垃圾收集。
3、CMS垃圾收集器
并发标记扫描(CMS)垃圾收集器使用多个线程扫描堆内存以标记逐出的实例,然后扫描标记的实例。CMS垃圾收集器仅在以下两个方案中保存所有的应用程序线程,
同时在预定生成空间中标记所引用的对象。
如果在执行垃圾收集的同时在堆存储器中发生改变。
与并行垃圾收集器相比,CMS收集器使用更多的CPU来确保更好的应用程序吞吐量。如果我们可以为更好的性能分配更多的CPU,则CMS垃圾收集器是在并行收集器上的首选选择。
打开 XX:+USeParNewGC 使用CMS垃圾收集器的JVM参数。
4、G1垃圾收集器
G1垃圾收集器用于大型堆内存区域。它将堆内存分隔为区域,并在它们之间并行进行集合。G1也确实在回收存储器之后压缩GO上的空闲堆空间。但是CMS垃圾收集器压缩了在停止世界(STW)情况下的内存。G1收集器首先基于大多数垃圾对该区域进行优先级排序。
打开 X:+UseG1GC 使用G1垃圾收集器的JVM参数。
Java8改进
打开 -XX:+UseStringDeduplication 使用G1垃圾收集器时的JVM参数。这通过将重复的字符串值删除为单个char[]数组来优化堆内存。此选项已引入Java8U20。
考虑到上述四种类型的Java垃圾收集器,使用哪种类型的Java垃圾收集器取决于应用程序方案、可用的硬件和吞吐量要求。
垃圾收集JVM选项
以下是与Java垃圾收集相关的关键JVM选项。
要运行的垃圾收集器的类型
GC优化选项
JVMGC选项的示例用法
Java-Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar