Java JVM垃圾收集

Java JVM垃圾收集,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,一般来说(我知道Oracle/sun和其他第三方以及MS都有标准的JVM实现),JVM是否只创建一个作为守护进程运行的垃圾收集线程来收集垃圾对象,还是JVM生成多个线程来完成垃圾收集?吞吐量收集器它是通过-XX:+UseParallelGC启用的,是默认收集器,使用多个线程。使用-XX:+useConMarkSweepGC启用的“并发低暂停收集器”使用一个线程作为并发收集器,但其停止世界集合是并行的 只有很少使用的单线程gc-XX:+UseSerialGC是单线程的 -XX:congcthre

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

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

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

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

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

另请查看Tuning garbage collector,了解以下问题:


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

  • ParallelGC线程是在“停止世界”收集阶段使用的线程
  • 并行标记线程(或并发GC线程)是用于将区域标记为清理候选区域并在不停止应用程序线程的情况下运行的线程
  • G1并发优化线程负责标记对单个区域记忆的引用集的更改
G1GC可以通过设置
-XX:+UseG1GC
来启用(请注意,尽管在Java 7中G1GC当时是不可靠的,所以不要在生产中使用它(因为Java 7已经过时了,所以也不应该在生产中使用它))


来源和

有趣的问题。我可以问你为什么关心吗?因为你不应该关心:DMS已经10年没有JVM了。我问这个问题不是为了在我的代码中加入任何关于GC线程数量的假设。这是为了我自己的教育或好奇心。谢谢。@ControlAltDel,GC性能非常重要,很难再强调了。多年来,低暂停/并发收集器消耗了大量待开发的资源。GC的运行方式决定了任何重要应用程序的可靠性/可用性。