JVM使用哪些GC参数?

18

我正在调查与GC调优相关的问题(请参见之前的问题),这需要大量的阅读和实验。

Sun Java 5+ JVM会根据其环境自动选择最佳的GC策略和参数,这很棒,但我无法弄清楚如何查询正在运行的JVM以查找这些参数。

理想情况下,我想知道各种与GC相关的-XX选项的值,这些值是由VM自动选择的。如果我有了这个信息,我就可以有一个基准来开始调整。

有人知道如何从正在运行的VM中恢复这些值吗?

4个回答

28

-XX:+PrintCommandLineFlags(打印命令行标志或由自适应(自动调整大小)功能配置的标志。)

-XX:+PrintFlagsInitial(转储所有默认标志和值。)

-XX:+PrintFlagsFinal(在处理命令行和自适应功能后转储所有标志。)

所以我认为后者对您有用,只需将其添加到您的命令行脚本中即可。


18

请查看HotSpotDiagnosticMBean

以下示例将打印出选项的值以及该值是DEFAULT还是VM_CREATION:

import java.lang.management.ManagementFactory;

import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;

public class HotSpotTest {

    public static void main(String [] args) throws Exception {
        printHotSpotOption("MaxHeapFreeRatio");
        printHotSpotOption("SurvivorRatio");
        printHotSpotOptions();
    }

    private static void printHotSpotOption(String option) throws Exception {
        ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic");
        String operationName = "getVMOption";
        Object [] params = new Object [] {option};
        String [] signature = new String[] {String.class.getName()};
        Object result = ManagementFactory.getPlatformMBeanServer().invoke(name, operationName, params, signature);
        CompositeDataSupport data = (CompositeDataSupport) result;

        System.out.println(option);
        System.out.println("- Value: "+data.get("value"));
        System.out.println("- Origin: "+data.get("origin"));
    }

    private static void printHotSpotOptions() throws Exception {
        ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic");
        String attributeName = "DiagnosticOptions";
        Object result = ManagementFactory.getPlatformMBeanServer().getAttribute(name, attributeName);
        CompositeData [] array = (CompositeData[]) result;
        for (CompositeData d : array) {
            System.out.println(d.get("name"));
            System.out.println("- Value: "+d.get("value"));
            System.out.println("- Origin: "+d.get("origin"));
        }
    }
}

+1 有趣,我之前还没看到过。我会试一下,看看它的详细程度是否足够。 - skaffman
这非常接近我所需要的,唯一的例外是我需要知道要询问哪些VMOptions。很遗憾它无法告诉我有哪些可用选项。 - skaffman
我修改了例子以打印可用的诊断选项。但它并不会打印出所有可用的VM选项。这里列出了所有的VM选项,你可能会被困在构建自己想要的选项列表和查询它们上:http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp - Kevin

7
理想情况下,我希望能知道虚拟机自动选择使用的各种与垃圾回收相关的-XX选项的值。只要有了这个数据,我就可以作为基准开始调整。
通常很难仅从提供的命令行标志推断出确切的堆配置。
如果您需要知道堆配置,并且您不在Windows环境中,则可以像博客文章中所述那样使用jmap -heap。
以下是提供的信息示例:
在新一代使用并行线程。 使用本地对象分配的线程。 并发标记-清除GC
堆配置: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1073741824 (1024.0MB) NewSize = 268435456 (256.0MB) MaxNewSize = 268435456 (256.0MB) OldSize = 805306368 (768.0MB) NewRatio = 7 SurvivorRatio = 6 PermSize = 21757952 (20.75MB) MaxPermSize = 88080384 (84.0MB)

0
如果你正在寻找一个快速且易于阅读的工具,jconsole 可能会是你的好朋友。具体来说,我正在查看当前运行的 FindBugs 进程的“VM 概要”选项卡,并看到以下细节:

当前堆大小:788,720 kbytes

最大堆大小:932,096 kbytes

已提交内存:923,648 kbytes

待定终结对象数:0 个

垃圾收集器:名称 = 'PS MarkSweep',收集次数 = 324,总耗时 = 12 分钟

垃圾收集器:名称 = 'PS Scavenge',收集次数 = 1,132,总耗时 = 1 分钟

显然,jvisualvm 也会提供相关细节,但它似乎没有那么专注于你特定的需求(即垃圾收集器的快速可读细节)。

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