JVM垃圾收集

一般情况下(因为我知道有一个来自Oracle / sun和其他第三方的标准JVM实现以及MS),JVM是否只创建一个作为守护进程运行的垃圾收集线程来收集垃圾对象或者JVM是否产生了多个一个线程来完成垃圾收集?

使用-XX:+UseParallelGC启用的“吞吐量收集器”是默认收集器使用多个线程。 使用-XX:+UseConcMarkSweepGC启用的“并发低暂停收集器”使用一个线程用于并发收集器,但其stop-the-world集合是并行的。

只有很少使用的单线程gc -XX:+UseSerialGC是单线程的。

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

-XX:ConcGCThreads = n – 并发垃圾收集器将使用的线程数。 默认值因运行JVM的平台而异。

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options

可能有更多垃圾收集器线程,但您不应该依赖它们的数量,运行顺序或任何东西。 然而,有必要的东西,你可以依靠。 例如: Object.finalize()将只调用一次。

另请查看调优垃圾收集器 ,关于以下问题:

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html#1.1.%20Types%20of%20Collectors%7Coutline

Oracle的Garbage-First GC算法(Java 8中提供,Java 9中的默认选项)是并行/并发GC算法,因此涉及多个线程。 具体来说,有许multithreading用于垃圾收集:

  • ParallelGC Threads是在“停止世界”收集阶段使用的线程
  • 并行标记线程(或并发GC线程)是用于将区域标记为清理和运行的候选者而不停止应用程序线程的线程
  • G1并发细化线程负责标记对单个区域记忆参考集的更改

可以通过设置-XX:+UseG1GC来启用-XX:+UseG1GC (请注意,尽管在Java 7 G1GC中可用,但此时不可靠,因此不要在生产中使用它(并且因为Java 7已经过期,所以你不应该’在生产中使用它)))。

来源https://blogs.oracle.com/g1gc/entry/g1gc_faq和http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html