运行JVM的GC参数是什么?

时间:2009-12-10 11:12:21

标签: java garbage-collection performance

我还在调查我在GC调整中遇到的问题(参见prior question),其中涉及大量的阅读和实验。

Sun Java5 + JVM尝试根据环境自动选择最佳GC策略和参数,这很好,但我无法弄清楚如何查询正在运行的JVM以找出这些参数是什么。

理想情况下,我想查看VM自动选择的各种与GC相关的-XX选项的值。如果我有这个,我可以有一个基线来开始调整。

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

5 个答案:

答案 0 :(得分:27)

-XX:+ PrintCommandLineFlags 打印在命令行上传递的标志或由人体工程学(自动调整大小)功能配置的标志。

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

-XX:+ PrintFlagsFinal 在处理命令行和人体工程学之后转储所有标志。

所以我认为后者会为你做,只需将它添加到你的命令行脚本。

答案 1 :(得分: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"));
        }
    }
}

答案 2 :(得分:7)

  

理想情况下,我想查看VM自动选择的各种与GC相关的-XX选项的值。如果我有这个,我可以有一个基线来开始调整。

通常从提供的命令行标志推断出精确的堆配置通常并不简单。

如果您需要了解堆配置并且您处于非Windows环境中,则可以使用此blog entry中所述的jmap -heap

以下是所提供信息的示例:

    using parallel threads in the new generation.
    using thread-local object allocation.
    Concurrent Mark-Sweep GC

    Heap Configuration:
       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)

答案 3 :(得分:0)

您可以使用JMX。启动JConsole,它应显示在 VM Summary 选项卡下。它应该显示已传递给JVM的所有参数。

要以编程方式执行此操作,您可以参考另一个SO答案:How to get vm arguments from inside of java application?

答案 4 :(得分:0)

如果您正在寻找一种快速简便的人类可读工具,jconsole可能是您的朋友。具体来说,我正在查看当前运行的FindBugs进程的“VM Summary”选项卡,我看到了这些细节:

  

当前堆大小:788,720千字节

     

最大堆大小:932,096千字节

     

承诺内存:923,648千字节

     

待定终结:0个对象

     

垃圾收集器:名称='PS MarkSweep',收集= 324,花费的总时间= 12分钟

     

Garbage collector:Name ='PS Scavenge',Collections = 1,132,花费的总时间= 1分钟

显然,jvisualvm会为您提供相关的详细信息,但它似乎并没有完全专注于您的特定需求(即垃圾收集器上快速可读的详细信息)。