我一直在阅读了关于Java和SO Q&A垃圾收集,但我感到困惑类型的垃圾收集的。
让我们以吞吐量收集作为一个例子。 (又名并行收集)。 该文件说,它使用多线程做主要收集未成年人集合和单个线程(同系列集热器)。
现在我的问题:
- 这是什么意思一个完整的GC:1)它是否意味着主,副集合做了什么? 或b)全部GC ==主要收藏? 哪一个?
- 如果一个),它意味着小的收集仍然是使用多线程,而主要是用单做呢?
- 如果B),它意味着使用单线程既扬老两代被清除?
此外,4不完整的GC只会影响OldGeneration或YoungGeneration呢?
提前致谢。
让我解释。
让我们以吞吐量收集作为一个例子。 (又名并行收集)。 该文件说,它使用多线程做主要收集未成年人集合和单个线程(同系列集热器)。
这里的东西理解。 默认情况下,大多数较新的系统,JVM使用老少三代两个不同的垃圾收集器。 在我的我的机器:我有并行新型捕年轻一代并发标记和清除收集老一辈。
当JVM则无法为新对象分配空间小的收集被触发(请记住:新对象始终在年轻一代的Eden区分配)。
下一个问题:
这是什么意思一个完整的GC:1)它是否意味着主,副集合做了什么? 或b)全部GC ==主要收藏? 哪一个?
和,
此外,4不完整的GC只会影响OldGeneration或YoungGeneration呢?
这取决于。 JVM报告每一个主要收藏为完整的GC。 [试着用这些标志java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamp
]。 迂腐的定义是全部运行GC未成年人第一,然后主要(虽然如果老一代是充满在这种情况下,首先释放以允许其从青年一代接受对象的顺序可以切换)。
OK,回到正题上来。 JVM认为主要类别[在旧版(或彼尔姆)生成]作为全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]
下一个问题:
如果一个),它意味着小的收集仍然是使用多线程,而主要是用单做呢?
是。 见我的答案的开始。 年轻和老一代是由不同的收藏家服务。 对于年轻一代,你可以使用以下的任何一种:
-
-XX:+UseSerialGC
-
-XX:+UseParallelGC
-
-XX:+UseParNewGC
对于老一代,可用的选项有:
-
-XX:+UseParallelOldGC
-
-XX:+UseConcMarkSweepGC
虽然妖精的回答仍然是正确的粗线条至少这部分现在已经过时:
这取决于。 JVM报告每一个主要收藏为完整的GC。
无论CMS和G1新一代(未成年人)的集合,老一代的并发集合和全GCS区分。 后者是一个不得已的事的东西,大部分GCing应该由新创和并发收集处理。