Java 8 的默认垃圾收集器

118

Java 8的默认垃圾回收器是什么?

当我检查JMX Beans时,它们显示新生代使用并行收集器,老年代使用串行收集器。

4个回答

163

默认垃圾收集器:

  • Java 7 - 并行GC
  • Java 8 - 并行GC
  • Java 9 - G1 GC
  • Java 10 - G1 GC

1
此答案作者未提供任何源代码。 - Beauregard Lionett

92

选择默认的垃圾回收器(以及其他内容)是JVM所谓的自适应过程。这个过程取决于你机器的类别。

  • 对于服务器级别的机器,定义为具有2个或更多物理处理器和2个或更多GB物理内存的机器(不考虑平台),默认的垃圾回收器是并行回收器(也称为吞吐量回收器)。
  • 对于客户端级别的机器,定义为Windows上32位平台或单处理器机器,默认的垃圾回收器是串行回收器。

由于实际上几乎所有的机器都有2个或更多CPU,因此JVM实际上总是将机器视为服务器级别。这就是为什么您会发现很多参考资料都认为并行回收器是默认的垃圾回收器的原因。


80

Java有四种垃圾收集器(截至版本10),但在Java 11稳定版发布后,将会有5种类型。它们分别是:

  1. 串行垃圾收集器- S GC
  2. 并行垃圾收集器- P GC
  3. CMS垃圾收集器- CMS GC
  4. G1垃圾收集器- G1 GC
  5. Z垃圾收集器- ZGC

Java中的默认GC实现-

JVM GC

 Java 7 - P GC       
 Java 8 - P GC
 Java 9 - G1 GC
 Java 10- G1 GC
 Java 11- Z GC(I am not sure but it would be default GC of java 11)

如需了解更多有关ZGC的详细信息,请访问{{链接}}。

http://openjdk.java.net/projects/zgc/

https://www.opsian.com/blog/javas-new-zgc-is-very-exciting/

注意:如果您想验证JVM当前使用的GC,请使用以下命令显示默认GC:

$ java -XX:+PrintCommandLineFlags -version 

如果您想根据自己的需要设置GC,可以通过以下命令实现。在这里,我将设置G1 GC为默认GC。

$ java -XX:+UseG1GC -XX:+PrintCommandLineFlags -version 

enter image description here

For more details , please visit 

https://javapapers.com/java/types-of-java-garbage-collectors/

https://alvinalexander.com/java/java-jvm-how-show-which-garbage-collector-running


提及图表来源以获取更多详细信息会很有用。 - xagaffar
3
嗨@xagaffar,这是源URL: https://javapapers.com/java/types-of-java-garbage-collectors/ - Brajesh
4
我认为ZGC不是JDK 11的默认垃圾收集器。Open JDK的Wiki页面(https://wiki.openjdk.java.net/display/zgc/Main)上写着:"使用-XX:+UnlockExperimentalVMOptions -XX:+UseZGC选项来启用ZGC",这意味着它不是默认选项。 - Ashish Kumar
1
不,这不是JDK11的默认设置。使用“-XX:+UnlockExperimentalVMOptions”和“-XX:+UseZGC”选项来启用ZGC以解锁ZGC。 - vsingh
2
这张图片中的流程图非常有用,可以解释“串行”、“并行”和“并发”垃圾收集器之间的区别,但是对于G1收集器来说,这九个彩色方块变得非常无意义。它们应该代表什么?线程变成了方块吗? - Holger
默认情况下,Java 11也使用G1 GC,就像您提供的命令所打印的那样: java -XX:+ PrintCommandLineFlags-version。 - Balu

1

从Java 9到Java 15,即使在Java 15上也默认使用G1GC。Java 15新增了两个新的垃圾回收器,一个是Oracle开发的ZGC,另一个是Red Hat实现的Shenandoah,两者均可用于生产环境,且于2020年9月发布。ZGC可在OPEN JDKhttps://wiki.openjdk.java.net/display/zgc/Main上使用。


1
  1. Shenandoah仅适用于OpenJDK,Oracle没有它。
  2. ZGC不是JDK 8或11的默认GC,仍需要使用“UnlockExperimentalVMOptions”,但在jdk 15上不再需要。
  3. ParallelGC是JDK 8的默认GC,这实际上是问题的关键。
- Francisco Melo junior
我要说的是,从Java 9到Java 15,G1GC仍然是默认的...即使最近添加了2个新的GC.. - chiperortiz
不对。你说“从Java 8到Java 15,即使在Java 15上,G1GC也是默认值”,措辞不正确。JDK 8的默认值是Parallel,你自己在评论中也说了这一点,所以答案仍然是错误的。Shenandoah可以在JDK 8和JDK 11中使用,它已经被向后移植了。 - Francisco Melo junior
是的,抱歉,我真正的意思是从Java 9开始。 - chiperortiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接