首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行JVM的GC参数是什么?

运行JVM的GC参数是什么?
EN

Stack Overflow用户
提问于 2009-12-10 19:12:21
回答 3查看 10.1K关注 0票数 18

我仍然在调查我在GC调优方面遇到的问题(参见prior question),这涉及到大量的阅读和实验。

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-10 23:23:23

查看HotSpotDiagnosticMBean

下面的示例将打印出选项的值以及该值是DEFAULT还是VM_CREATION:

代码语言:javascript
复制
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"));
        }
    }
}
票数 18
EN

Stack Overflow用户

发布于 2011-02-13 05:03:46

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

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

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

因此,我认为后者将为您做,只需将其添加到您的命令行脚本中。

票数 27
EN

Stack Overflow用户

发布于 2009-12-11 20:21:03

如果您正在寻找一种快速易用的人类可读工具,jconsole可能是您的朋友。具体地说,我正在查看当前运行的FindBugs进程上的"VM摘要“选项卡,我看到了以下详细信息:

当前堆大小:788,720 kbytes

最大堆大小:9,932,096 kbytes

提交内存:9,923,648千字节

待定:0个对象

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

垃圾收集器:名称= 'PS Scavenge',收集量= 1,132,花费的总时间=1分钟

显然,jvisualvm会给你提供相关的细节,但它似乎不太关注你的特定需求(即,垃圾收集器的快速可读细节)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1880299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档