Java垃圾收集策略

3
我正在寻找一种技术来查找Java虚拟机在某个时间点使用的垃圾回收(GC)策略(收集器)。 (随后,我希望它能正确反映我选择的策略,例如XX:+ UseConcMarkSweepGC。)
基本形式的verbose: gc并不能帮助我,因为它只显示了每个所做的所有操作。是否有其他标志可以设置,以使其输出正在使用的GC策略?
JDK版本为1.6_21。

我在我的答案中添加了有关 jinfo.exe 的另一个小提示。 - Strelok
请注意,这高度依赖于供应商。 - Thorbjørn Ravn Andersen
默认(并行)GC策略始终相同。只有在命令行上指定了Concurrent Mark Sweep或G1时,才会使用它们。也许您可以解释一下,为什么不知道您正在指定哪个GC... - Peter Lawrey
@Peter,我们怎么能确定默认值总是并行的?有没有一种方法可以检查?而且,如果符合人体工程学,这总是正确的吗? - pugmarx
1
如果您需要使用特定的GC策略,您应该指定它。不要让它靠运气。通常情况下,这是很重要的。但是对于Sun的Java 1.4.2及更高版本,默认值为Parallel GC。请参阅Sun的文档。如果您使用另一个JVM,可能会有完全不同的GC策略。 - Peter Lawrey
4个回答

8

嗯...您可以通过jconsole(VM Summary)页面了解某个JVM正在使用的策略。不确定是否可以影响或更改它。

编辑: 要通过编程方式检查和更改正在运行的VM的JVM标志,可以使用JDK中的jinfo.exe实用程序。例如,要检查是否设置了ParallelGC标志,可以运行:jinfo.exe -flag UseParallelGC <PID>。


耶!我想这就是我的烦恼的答案。 :) jconsole 给了我以下的细节:

垃圾收集器: 名称 = 'PS MarkSweep',收集次数 = 0,总共花费时间 = 0.000 秒

垃圾收集器: 名称 = 'PS Scavenge',收集次数 = 9,总共花费时间 = 0.028 秒

是的,当我设置 VM args: -XX:+UseParallelGC(并覆盖默认值(ConcMarkSweepGC))时,它确实受到了影响。谢谢!
- pugmarx
仅此而已,我无法确定默认策略VM正在使用哪种垃圾收集器(也就是说,如果我没有显式传递VM参数进行GC)。 jconsole摘要显示: 垃圾收集器: 名称='Copy',收集次数=319,总耗时=1.188秒 垃圾收集器: 名称='MarkSweepCompact',收集次数=5,总耗时=0.454秒但是当我使用jinfo.exe -flag UseConcMarkSweepGC <pid>时, 它给了我一个负面的标志(表明它没有被使用)。无论如何,我会继续挖掘。 - pugmarx

4
如果您想在运行在JVM上的应用程序中获取此信息,则可以使用GarbageCollectorMXBean: (点击此处)
List<GarbageCollectorMXBean> gcs =
  ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean gc : gcs) {
  System.out.println(gc.getName());
}

1

0

再次强调,GC的行为可以受到影响,但无法预测。


我很有兴趣了解它受到了哪些影响。 :) - pugmarx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接