运行JVM的GC参数是什么?

ska*_*man 18 java performance garbage-collection

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

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

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

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

Sco*_*rey 27

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

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

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

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


Kev*_*vin 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"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


fgl*_*lez 7

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

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

如果您需要了解堆配置并且您处于非Windows环境中,则可以使用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)