代码之家  ›  专栏  ›  技术社区  ›  skaffman

运行JVM的GC参数是什么?

  •  18
  • skaffman  · 技术社区  · 15 年前

    我仍在调查GC调优的问题(请参见 prior question 这需要大量的阅读和实验。

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

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

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

    5 回复  |  直到 12 年前
        1
  •  18
  •   Kevin    15 年前

    退房 HotSpotDiagnosticMBean

    以下示例将打印出选项的值以及该值是默认值还是创建vm_:

    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
  •  27
  •   Scott Carey    13 年前

    -xx:+打印命令行标志 打印通过命令行传递或由人机工程学(自动调整大小)功能配置的标志。

    -xx:+printflagsinitial 转储所有默认标志和值。

    -XX:+打印旗舰版最终版 在处理命令行和人机工程学之后,转储所有标志。

    所以我认为后者会为您做些什么,只需将其添加到您的命令行脚本中即可。

        3
  •  7
  •   fglez    12 年前

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

    仅仅从提供的命令行标志推断确切的堆配置通常并不容易。

    如果您需要了解堆配置,并且您处于非Windows环境中,则可以使用 jmap -heap 就像这个解释的那样 blog entry .

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

        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)
    
        4
  •  0
  •   Dean Hill    7 年前

    您可以使用JMX。启动jconsole,它应该显示在 虚拟机概要 标签。它应该显示已经传递给JVM的所有参数。

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

        5
  •  0
  •   Bob Cross n8wrl    15 年前

    如果你想找一个快速易读的工具, jconsole 可能是你的朋友。具体来说,我正在查看当前运行的findbugs进程上的“vm summary”选项卡,我看到以下详细信息:

    当前堆大小:_788720 kbytes

    最大堆大小:_932096 kbytes

    提交内存:923648 kbytes

    挂起完成:_0个对象

    垃圾收集器:_name='ps marksweep',collections=324,total time speed=12分钟

    垃圾收集器:_name='ps scavenge',collections=1132,total time speed=1分钟

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