2009-12-10 22 views
17

我仍在調查我使用GC調諧的問題(請參閱prior question),其中涉及大量閱讀和實驗。 Sun Java5 + JVM試圖根據它們的環境自動選擇最佳的GC策略和參數,這很好,但我無法弄清楚如何查詢正在運行的JVM以查明這些參數是什麼。什麼GC參數是與JVM一起運行的?

理想情況下,我想查看VM自動選擇的各種與GC相關的-XX選項的值。如果我有這個,我可以有一個基準開始調整。

任何人都知道從正在運行的VM恢復這些值?

回答

18

退房的HotSpotDiagnosticMBean

下面的例子將打印出的期權價值以及價值是否違約或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")); 
     } 
    } 
} 
+0

+1有趣的是,我以前沒有見過。我會玩,看看它是否足夠詳細。 – skaffman 2009-12-10 16:40:05

+0

這是非常接近我需要的,除了我需要知道哪些VMOptions要求。這是一個真正的恥辱,它不能告訴我什麼是可用的。 – skaffman 2009-12-11 12:28:48

+0

我修改了示例以打印可用的診斷選項。但是,它不會打印每個可用的VM選項。所有虛擬機選項都在這裏列出,你可能會被困住建立一個你想要的列表並查詢它們:http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp – Kevin 2009-12-11 13:49:10

0

您可以使用JMX。啓動JConsole,它應顯示在虛擬機摘要選項卡下。它應該顯示所有傳遞給JVM的參數。

要做到這一點編程,你可以參考另一個SO回答:How to get vm arguments from inside of java application?

+0

謝謝,但我知道我傳遞給VM的參數,因爲我有腳本來運行它。我想知道虛擬機爲我未指定的參數默認的值。 – skaffman 2009-12-10 11:51:42

0

如果你正在尋找一個快速簡便的人類可讀的工具,jconsole可能會在這裏你的朋友。具體來說,我看我的當前運行FindBugs的過程中,「虛擬機摘要」選項卡,我看到這些細節:

當前堆大小:788720個字節

最大堆大小:932096個字節

提交內存:923648千字節

掛起終止:0物體

垃圾收集器:名稱= 'PS MarkSweep',類別= 324,花費的總時間= 12分鐘

垃圾收集器:產品名稱=「PS掃氣」,集合= 1132,花費的總時間=1分鐘

顯然,jvisualvm會給你相關的細節,但它似乎沒有相當的緊緊圍繞您的特定需求(即垃圾收集器上的快速可讀細節)。

7

理想情況下,我希望看到由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) 
27

-XX:+ PrintCommandLineFlags 打印標誌傳遞命令行或人機工程學配置(自動調整大小)的功能。

-XX:+ PrintFlagsInitial 轉儲所有默認標誌和值。

-XX:+ PrintFlagsFinal 轉儲處理命令行和人機工程學後的所有標誌。

所以我認爲後者會爲你做,只需將它添加到你的命令行腳本。