Java主要和次要垃圾收集
我一直在阅读Java中的垃圾收集和问答,但我对垃圾收集的类型感到困惑 让我们以吞吐量收集器为例。(也称为并行收集器)。文档说它使用多个线程来执行次要收集,而主要收集使用单线程(与串行收集器相同) 现在我的问题是:Java主要和次要垃圾收集,java,garbage-collection,Java,Garbage Collection,我一直在阅读Java中的垃圾收集和问答,但我对垃圾收集的类型感到困惑 让我们以吞吐量收集器为例。(也称为并行收集器)。文档说它使用多个线程来执行次要收集,而主要收集使用单线程(与串行收集器相同) 现在我的问题是: 完整的GC意味着什么:a)它意味着次要和主要的收集都完成了吗?或b)完整GC==主要集合?是哪一个 如果a),是否意味着次要收集仍然使用多个线程完成,而主要收集使用单个线程完成 如果是b),这是否意味着年轻人和老年人都使用单线程清除 而且, 4.完全GC是否也只影响老一代或年轻一代 提
java-verbose:gc-XX:+PrintGCDetails-XX:+PrintGCTimeStamp
]。学究式的定义是,完整GC首先运行Minor,然后运行Major(尽管如果较老的一代已满,则可以切换顺序,在这种情况下,首先释放它以允许它接收来自年轻一代的对象)
好的,回到正题。JVM将[旧一代(或Perm)中的]主要集合视为完整GC。下面是我能够快速编写的一个程序的输出,以说明这一点。第一行是次要GC,第二行是主要(完整)GC。您可以看到,这只发生在老一代(CMS)中,并且能够将老一代从1082K减少到1034K
11.431:[GC 11.431:[ParNew:1152K->128K(1152K),0.0009893秒]2111K->1210K(6464K),0.0010182秒][次:user=0.00 sys=0.00,real=0.00秒]
17.882:[Full-GC(System)17.882:[CMS:1082K->1034K(5312K),0.0212614秒]2034K->1034K(6464K),[CMS-Perm:9426K->9410K(21248K)],0.021320秒][次:用户=0.02系统=0.00,实数=0.02秒]
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseParNewGC
-XX:+UseParallelOldGC
-XX:+UseConMarkSweepGC
让我解释一下
让我们以吞吐量收集器为例。(也称为并行收集器)。文档说它使用多个线程来完成次要收集,使用单个线程来完成主要收集(与串行收集器相同)
这里有一些需要理解的东西。默认情况下,在大多数较新的系统上,JVM为年轻一代和老一代使用两种不同的垃圾收集器。在我的机器上:我为年轻一代配备了并行新收集器,为老一代配备了并行标记和扫描收集器
当JVM无法为新对象分配空间时(请记住:新对象总是在年轻一代的伊甸园区域分配),就会触发小集合
下一个问题:
完整的GC意味着什么:a)它意味着次要和主要的收集都完成了吗?或b)完整GC==主要集合?是哪一个
以及
还有,4。完全GC是否也只影响老一代或年轻一代
视情况而定。JVM将每个主要集合报告为完整GC。[尝试使用这些标志
java-verbose:gc-XX:+PrintGCDetails-XX:+PrintGCTimeStamp
]。学究式的定义是,完整GC首先运行Minor,然后运行Major(尽管如果较老的一代已满,则可以切换顺序,在这种情况下,首先释放它以允许它接收来自年轻一代的对象)
好的,回到正题。JVM将[旧一代(或Perm)中的]主要集合视为完整GC。下面是我能够快速编写的一个程序的输出,以说明这一点。第一行是次要GC,第二行是主要(完整)GC。您可以看到,这只发生在老一代(CMS)中,并且能够将老一代从1082K减少到1034K
11.431:[GC 11.431:[ParNew:1152K->128K(1152K),0.0009893秒]2111K->1210K(6464K),0.0010182秒][次:user=0.00 sys=0.00,real=0.00秒]
17.882:[Full-GC(System)17.882:[CMS:1082K->1034K(5312K),0.0212614秒]2034K->1034K(6464K),[CMS-Perm:9426K->9410K(21248K)],0.021320秒][次:用户=0.02系统=0.00,实数=0.02秒]