我仍然在调查我在GC调优方面遇到的问题(参见prior question),这涉及到大量的阅读和实验。
Sun尝试根据它们的环境自动选择最佳的GC策略和参数,这很棒,但是我不知道如何查询正在运行的Java5+来找出这些参数是什么。
理想情况下,我希望查看VM自动选择的与GC相关的各种-XX选项的值。如果我有这个能力,我就可以有一个基准来开始调整。
有人知道如何从正在运行的VM中恢复这些值吗?
发布于 2009-12-10 23:23:23
查看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"));
}
}
}发布于 2011-02-13 05:03:46
-XX:+PrintCommandLineFlags打印在命令行上传递的或由人体工程学(自动调整大小)功能配置的标志。
-XX:+PrintFlagsInitial转储所有默认标志和值。
-XX:+PrintFlagsFinal在处理命令行和人体工程学之后转储所有标志。
因此,我认为后者将为您做,只需将其添加到您的命令行脚本中。
发布于 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会给你提供相关的细节,但它似乎不太关注你的特定需求(即,垃圾收集器的快速可读细节)。
https://stackoverflow.com/questions/1880299
复制相似问题