我仍在調查我使用GC調諧的問題(請參閱prior question),其中涉及大量閱讀和實驗。 Sun Java5 + JVM試圖根據它們的環境自動選擇最佳的GC策略和參數,這很好,但我無法弄清楚如何查詢正在運行的JVM以查明這些參數是什麼。什麼GC參數是與JVM一起運行的?
理想情況下,我想查看VM自動選擇的各種與GC相關的-XX選項的值。如果我有這個,我可以有一個基準開始調整。
任何人都知道從正在運行的VM恢復這些值?
我仍在調查我使用GC調諧的問題(請參閱prior question),其中涉及大量閱讀和實驗。 Sun Java5 + JVM試圖根據它們的環境自動選擇最佳的GC策略和參數,這很好,但我無法弄清楚如何查詢正在運行的JVM以查明這些參數是什麼。什麼GC參數是與JVM一起運行的?
理想情況下,我想查看VM自動選擇的各種與GC相關的-XX選項的值。如果我有這個,我可以有一個基準開始調整。
任何人都知道從正在運行的VM恢復這些值?
下面的例子將打印出的期權價值以及價值是否違約或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"));
}
}
}
您可以使用JMX。啓動JConsole,它應顯示在虛擬機摘要選項卡下。它應該顯示所有傳遞給JVM的參數。
要做到這一點編程,你可以參考另一個SO回答:How to get vm arguments from inside of java application?
謝謝,但我知道我傳遞給VM的參數,因爲我有腳本來運行它。我想知道虛擬機爲我未指定的參數默認的值。 – skaffman 2009-12-10 11:51:42
理想情況下,我希望看到由VM自動選擇的各種GC相關-XX選項的使用值。如果我有這個,我可以有一個基準開始調整。
從通過提供的命令行標誌推斷確切的堆配置通常並不簡單。
如果您需要了解堆配置並且您處於非Windows環境中,則可以使用jmap -heap
,如blog entry中所述。
這裏是所提供的信息的示例:
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)
-XX:+ PrintCommandLineFlags 打印標誌傳遞命令行或人機工程學配置(自動調整大小)的功能。
-XX:+ PrintFlagsInitial 轉儲所有默認標誌和值。
-XX:+ PrintFlagsFinal 轉儲處理命令行和人機工程學後的所有標誌。
所以我認爲後者會爲你做,只需將它添加到你的命令行腳本。
+1有趣的是,我以前沒有見過。我會玩,看看它是否足夠詳細。 – skaffman 2009-12-10 16:40:05
這是非常接近我需要的,除了我需要知道哪些VMOptions要求。這是一個真正的恥辱,它不能告訴我什麼是可用的。 – skaffman 2009-12-11 12:28:48
我修改了示例以打印可用的診斷選項。但是,它不會打印每個可用的VM選項。所有虛擬機選項都在這裏列出,你可能會被困住建立一個你想要的列表並查詢它們:http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp – Kevin 2009-12-11 13:49:10