我还在调查我在GC调整中遇到的问题(参见prior question),其中涉及大量的阅读和实验。
Sun Java5 + JVM尝试根据环境自动选择最佳GC策略和参数,这很好,但我无法弄清楚如何查询正在运行的JVM以找出这些参数是什么。
理想情况下,我想查看VM自动选择的各种与GC相关的-XX选项的值。如果我有这个,我可以有一个基线来开始调整。
任何人都知道从正在运行的VM中恢复这些值吗?
答案 0 :(得分:27)
-XX:+ PrintCommandLineFlags 打印在命令行上传递的标志或由人体工程学(自动调整大小)功能配置的标志。
-XX:+ PrintFlagsInitial 转储所有默认标志和值。
-XX:+ PrintFlagsFinal 在处理命令行和人体工程学之后转储所有标志。
所以我认为后者会为你做,只需将它添加到你的命令行脚本。
答案 1 :(得分:18)
以下示例将打印出选项的值以及值是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"));
}
}
}
答案 2 :(得分:7)
理想情况下,我想查看VM自动选择的各种与GC相关的-XX选项的值。如果我有这个,我可以有一个基线来开始调整。
通常从提供的命令行标志推断出精确的堆配置通常并不简单。
如果您需要了解堆配置并且您处于非Windows环境中,则可以使用此blog entry中所述的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)
答案 3 :(得分:0)
您可以使用JMX。启动JConsole,它应显示在 VM Summary 选项卡下。它应该显示已传递给JVM的所有参数。
要以编程方式执行此操作,您可以参考另一个SO答案:How to get vm arguments from inside of java application?
答案 4 :(得分:0)
如果您正在寻找一种快速简便的人类可读工具,jconsole可能是您的朋友。具体来说,我正在查看当前运行的FindBugs进程的“VM Summary”选项卡,我看到了这些细节:
当前堆大小:788,720千字节
最大堆大小:932,096千字节
承诺内存:923,648千字节
待定终结:0个对象
垃圾收集器:名称='PS MarkSweep',收集= 324,花费的总时间= 12分钟
Garbage collector:Name ='PS Scavenge',Collections = 1,132,花费的总时间= 1分钟
显然,jvisualvm会为您提供相关的详细信息,但它似乎并没有完全专注于您的特定需求(即垃圾收集器上快速可读的详细信息)。