运行JVM的GC参数是什么?

我还在调查GC调整的问题 (参见前面的问题 ),这涉及到大量的阅读和实验。

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

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

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

查看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")); } } } 

-XX:+ PrintCommandLineFlags打印在命令行上传递的标志或由人体工程学(自动resize)function配置的标志。

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

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

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

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

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

如果您需要了解堆配置并且您处于非Windows环境中,则可以使用jmap -heap如本博客条目中所述 。

以下是提供的信息示例:

    在新一代中使用并行线程。
    使用线程局部对象分配。
    并发Mark-Sweep GC

    堆配置:
        MinHeapFreeRatio = 40
        MaxHeapFreeRatio = 70
        MaxHeapSize = 1073741824(1024.0MB)
        NewSize = 268435456(256.0MB)
        MaxNewSize = 268435456(256.0MB)
        OldSize = 805306368(768.0MB)
        NewRatio = 7
       幸存者比率= 6
        PermSize = 21757952(20.75MB)
        MaxPermSize = 88080384(84.0MB)

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

要以编程方式执行此操作,您可以参考另一个SO答案: 如何从Java应用程序内部获取vm参数?

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

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

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

承诺内存:923,648千字节

待定结束:0个对象

垃圾收集器:Name =’PS MarkSweep’,Collections = 324,花费的总时间= 12分钟

垃圾收集器:Name =’PS Scavenge’,Collections = 1,132,花费的总时间= 1分钟

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