JVM 使用哪些 GC 参数运行?

2022-09-02 19:22:38

我仍在调查GC调优的问题(参见上一个问题),这涉及大量的阅读和实验。

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

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

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


答案 1

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

-XX:+PrintFlags初始转储所有默认标志和值。

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

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


答案 2

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

推荐