一般情况下(因为我知道有一个来自Oracle / sun和其他第三方的标准JVM实现以及MS),JVM是否只创建一个作为守护进程运行的垃圾收集线程来收集垃圾对象或者做JVM产生多个线程来完成垃圾收集?
答案 0 :(得分:6)
使用-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
答案 1 :(得分:1)
-XX:ConcGCThreads = n - 并发垃圾收集器将使用的线程数。默认值因运行JVM的平台而异。
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options
可能有更多垃圾收集器线程,但您不应该依赖它们的数量,运行顺序或任何东西。然而,有必要的东西,你可以依靠。例如: Object.finalize()将只调用一次。
还要查看调整垃圾收集器,关于以下问题:
答案 2 :(得分:1)
Oracle的Garbage-First GC算法(Java 8中提供,Java 9中的默认选项)是并行/并发GC算法,因此涉及多个线程。具体来说,有许多线程用于垃圾收集:
可以通过设置-XX:+UseG1GC
来启用G1GC(请注意,虽然Java 7 G1GC中可用的时间不可靠,因此不要在生产中使用它(因为Java 7已经过生命周期)你不应该在生产中使用它))。
来源https://blogs.oracle.com/g1gc/entry/g1gc_faq和http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html