让我解释。
让我们以吞吐量收集器为例。(又名Parallel
Collector)。文档说它使用多个线程来进行次要集合,而使用单个线程来进行主要集合(与串行收集器相同)。
这是要理解的东西。默认情况下,在大多数较新的系统上,JVM使用两个不同的年轻代和老一代垃圾收集器。在我的机器上:我有年轻一代的 并行新收集 器
,老一代有 并行标记和扫描收集器 。
当JVM无法为新对象分配空间时会触发次要收集(请记住:新对象始终在Young Generation的Eden区域中分配)。
下一个问题:
完整GC的含义是什么:a)是否意味着次要收藏和主要收藏都已完成?或b)完整GC ==主要收藏?哪一个?
和,
另外,4. Full GC是否也只影响OldGeneration或YoungGeneration?
这取决于。JVM将每个主要集合报告为完整GC。[尝试使用这些标志
java -verbose:gc -XX:+PrintGCDetails-XX:+PrintGCTimeStamp]。根深蒂固的定义是,Full GC首先运行Minor,然后运行Major(尽管如果Old
Generation已满,则可以切换顺序,在这种情况下,它首先被释放以允许其接收Young Generation的对象)。
好,回到重点。JVM认为[较旧(或Perm)代中的] Major Collection是Full
GC。以下是我能够快速编写以说明这一点的程序的输出。第一行是次要GC,第二行是主要(完整)GC。您可以看到它仅在较老的一代(CMS)中发生过,并且能够将较早的一代从1082K减少到1034K。
11.431: [GC 11.431: [ParNew: 1152K->128K(1152K), 0.0009893 secs] 2111K->1210K(6464K), 0.0010182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
17.882: [Full GC (System) 17.882: [CMS: 1082K->1034K(5312K), 0.0212614 secs] 2034K->1034K(6464K), [CMS Perm : 9426K->9410K(21248K)], 0.0213200 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
下一个问题:
如果是a),是否意味着次要集合仍使用多个线程完成,而主要集合仍使用单个线程完成?
是。看到我的答案的开始。年轻人和老年人由不同的收藏家服务。对于年轻一代,您可以使用以下任意一种:
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseParNewGC
对于旧一代,可用的选择是:
-XX:+UseParallelOldGC
-XX:+UseConcMarkSweepGC



