JVM垃圾收集

时间:2012-06-15 13:57:58

标签: java garbage-collection jvm

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

3 个答案:

答案 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()将只调用一次。

还要查看调整垃圾收集器,关于以下问题:

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

答案 2 :(得分:1)

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

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

可以通过设置-XX:+UseG1GC来启用G1GC(请注意,虽然Java 7 G1GC中可用的时间不可靠,因此不要在生产中使用它(因为Java 7已经过生命周期)你不应该在生产中使用它))。

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