2009-12-10 13 views
17

मैं अभी भी जीसी ट्यूनिंग के साथ मुद्दों की जांच कर रहा हूं (prior question देखें), जिसमें बहुत सी पढ़ाई और प्रयोग शामिल है।क्या जीसी पैरामीटर एक जेवीएम चल रहा है?

सूर्य जावा 5 + जेवीएम स्वचालित रूप से इष्टतम जीसी रणनीति और पैरामीटर को अपने पर्यावरण के आधार पर चुनने का प्रयास करते हैं, जो कि बहुत अच्छा है, लेकिन मैं यह नहीं समझ सकता कि चल रहे जेवीएम को यह पता लगाने के लिए कि वे पैरामीटर क्या हैं।

आदर्श रूप से, मैं देखना चाहता हूं कि विभिन्न जीसी-संबंधित -XX विकल्पों के मूल्यों का उपयोग किया जा रहा है, जैसा कि स्वचालित रूप से वीएम द्वारा चुना गया है। अगर मेरे पास ऐसा था, तो मुझे ट्विकिंग शुरू करने के लिए आधारभूत आधार मिल सकता था।

कोई भी इन मानों को एक चल रहे वीएम से पुनर्प्राप्त करने के बारे में जानता है?

उत्तर

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

+0

यह मुझे वास्तव में क्या चाहिए, यह अपवाद के साथ है कि मुझे यह जानने की आवश्यकता है कि कौन से वीएमओप्शन पूछना है। यह एक वास्तविक शर्म की बात है कि यह मुझे नहीं बता सकता कि क्या उपलब्ध है। – skaffman

+0

मैंने उपलब्ध डायग्नोस्टिक विकल्पों को मुद्रित करने के लिए उदाहरण को संशोधित किया। हालांकि, यह हर उपलब्ध वीएम विकल्प मुद्रित नहीं करता है। सभी वीएम विकल्प यहां सूचीबद्ध हैं, आप उन लोगों की एक सूची बना सकते हैं जिन्हें आप चाहते हैं और उनके लिए पूछताछ कर रहे हैं: http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp – Kevin

0

आप इसके लिए जेएमएक्स का उपयोग कर सकते हैं। JConsole को हटा दें, और इसे वीएम सारांश टैब के अंतर्गत प्रदर्शित किया जाना चाहिए। यह उन सभी तर्कों को प्रदर्शित करना चाहिए जो JVM को पास किए गए हैं।

यह प्रोग्राम के करने के लिए, यदि आप किसी अन्य का उल्लेख तो जवाब कर सकते हैं: How to get vm arguments from inside of java application?

+0

धन्यवाद, लेकिन मुझे पता है कि मैं वीएम को किस तर्क को पारित करता हूं, क्योंकि मेरे पास यह स्क्रिप्ट है जो इसे चलाती है। मैं जानना चाहता हूं कि वीएम ने उन पैरामीटरों के लिए किस मूल्य को डिफॉल्ट किया है जिन्हें मैंने निर्दिष्ट नहीं किया है। – skaffman

0

आप एक त्वरित और आसान मानव पठनीय उपकरण के लिए देख रहे हैं, jconsole अपने दोस्त यहाँ हो सकता है। विशेष रूप से, मैं अपने वर्तमान में चल रहे FindBugs प्रक्रिया पर "वी एम सारांश" टैब पर देख रहा हूँ और मैं इन विवरणों को देखने:

वर्तमान ढेर आकार: 788,720 Kbytes

अधिकतम ढेर आकार: 932,096 Kbytes

प्रतिबद्ध स्मृति: 923,648 Kbytes

लंबित अंतिम रूप दिए जाने: 0 वस्तुओं

कचरा कलेक्टर: नाम = 'पुनश्च MarkSweep', संग्रह = 324, कुल समय बिताया = 12 मिनट

कचरा कलेक्टर: नाम = 'पी एस, मांजना', संग्रह = 1,132, कुल समय = 1 मिनट

जाहिर

बिताया है, jvisualvm आप संबंधित विवरण दे देंगे लेकिन इसका दायरा होना प्रतीत नहीं होता है आपकी विशिष्ट जरूरतों पर कड़ाई से केंद्रित (यानी, कचरा कलेक्टर पर जल्दी से पठनीय विवरण)।

7

आदर्श रूप से, मैं देखना चाहता हूं कि विभिन्न जीसी-संबंधित -XX विकल्पों के मूल्यों का उपयोग किया जा रहा है, जैसा कि स्वचालित रूप से वीएम द्वारा चुना गया है। अगर मेरे पास ऐसा था, तो मुझे ट्विकिंग शुरू करने के लिए आधारभूत आधार मिल सकता था।

यह आमतौर पर कमांड लाइन झंडे से सटीक ढेर कॉन्फ़िगरेशन को कम करने के लिए सीधा नहीं है।

यदि आपकी आवश्यकता ढेर कॉन्फ़िगरेशन को जानना है और आप एक गैर-विंडोज वातावरण में हैं तो आप 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 प्रिंटों झंडे कमांड लाइन पर पारित कर दिया या ergonomics द्वारा विन्यस्त (स्वत: आकार) सुविधाओं

यहाँ उपलब्ध कराई गई जानकारी का एक नमूना है।

-XX: + PrintFlagsInitial सभी डिफ़ॉल्ट झंडे और मानों को डंप करता है।

-XX: + प्रिंटफ्लैगफ़ाइनल कमांड लाइन और एर्गोनॉमिक्स को प्रोसेस करने के बाद सभी झंडे डंप करता है।

तो मुझे लगता है कि बाद वाला आपके लिए करेगा, बस इसे अपनी कमांड लाइन स्क्रिप्ट में जोड़ें।

संबंधित मुद्दे