7

一般来说(据我所知,Oracle/sun 和其他第三方以及 MS 等有一个标准的 JVM 实现),JVM 是否只创建一个作为守护进程运行的垃圾收集线程来收集垃圾对象,或者 JVM 是否产生超过一个线程来完成垃圾收集?

4

3 回答 3

6

-XX:+UseParallelGC启用并作为默认收集器的“吞吐量收集器”使用多个线程。启用的“并发低暂停收集器”-XX:+UseConcMarkSweepGC使用一个线程进行并发收集器,但它的停止世界收集是并行的。

只有很少使用的单线程 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

于 2012-06-15T14:05:54.343 回答
1

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

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

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

另请查看Tuning Garbage collector,关于以下问题:

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

于 2012-06-15T14:07:20.307 回答
1

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

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

G1GC 可以通过设置启用-XX:+UseG1GC(请注意,虽然在 Java 7 中可用,但 G1GC 在那个时间点是不可靠的,所以不要在生产中使用它(并且由于 Java 7 已经报废,你不应该在生产中使用它)任何一个))。

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

于 2016-12-09T06:16:54.163 回答