我正在调查与GC调优相关的问题(请参见之前的问题),这需要大量的阅读和实验。
Sun Java 5+ JVM会根据其环境自动选择最佳的GC策略和参数,这很棒,但我无法弄清楚如何查询正在运行的JVM以查找这些参数。
理想情况下,我想知道各种与GC相关的-XX选项的值,这些值是由VM自动选择的。如果我有了这个信息,我就可以有一个基准来开始调整。
有人知道如何从正在运行的VM中恢复这些值吗?
我正在调查与GC调优相关的问题(请参见之前的问题),这需要大量的阅读和实验。
Sun Java 5+ JVM会根据其环境自动选择最佳的GC策略和参数,这很棒,但我无法弄清楚如何查询正在运行的JVM以查找这些参数。
理想情况下,我想知道各种与GC相关的-XX选项的值,这些值是由VM自动选择的。如果我有了这个信息,我就可以有一个基准来开始调整。
有人知道如何从正在运行的VM中恢复这些值吗?
-XX:+PrintCommandLineFlags(打印命令行标志或由自适应(自动调整大小)功能配置的标志。)
-XX:+PrintFlagsInitial(转储所有默认标志和值。)
-XX:+PrintFlagsFinal(在处理命令行和自适应功能后转储所有标志。)
所以我认为后者对您有用,只需将其添加到您的命令行脚本中即可。
以下示例将打印出选项的值以及该值是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"));
}
}
}
显然,jvisualvm 也会提供相关细节,但它似乎没有那么专注于你特定的需求(即垃圾收集器的快速可读细节)。当前堆大小:788,720 kbytes
最大堆大小:932,096 kbytes
已提交内存:923,648 kbytes
待定终结对象数:0 个
垃圾收集器:名称 = 'PS MarkSweep',收集次数 = 324,总耗时 = 12 分钟
垃圾收集器:名称 = 'PS Scavenge',收集次数 = 1,132,总耗时 = 1 分钟