2016-05-18 5 views
6

बेहतर प्रोफाइलिंग डेटा का समर्थन करने के लिए मैं अपने जेवीएमटीआई एजेंट को कुछ जेवीएम झंडे सक्षम करने के लिए चाहता हूं। प्रश्न में एजेंट Honest-Profiler है और इसे केवल स्टार्टअप पर ही लोड किया जा सकता है।JVMTI एजेंट स्टार्टअप पर एक JVM ध्वज कैसे सेट कर सकता है?

मैं झंडे सक्षम करना चाहते हैं: -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints

मुद्दे के अनुसार दस्तावेज here यदि झंडे पर नहीं हैं हम एक पक्षपाती प्रोफ़ाइल मिलता है। उपयोगकर्ता को चेतावनी से परे जाना और ध्वज को सक्षम करना अच्छा होगा।

+2

यदि आपको कानूनी समाधान नहीं मिलेगा, तो @apangin से gory दृष्टिकोण है: https://github.com/odnoklassniki/one-elf/blob/master/test/one/jvm/HotspotFlags.java इसे पता पता चला libjvm.so लोड किया गया है और .so पता + .symtab निरंतर ऑफ़सेट से ध्वज पता की गणना करता है (लेकिन यह हमेशा काम नहीं करता है, वीएम कोड में ठोस ध्वज उपयोग पर निर्भर करता है) – qwwdfsad

उत्तर

8

DebugNonSafepoints के रूप में आपको इस ध्वज को सेट करने की भी आवश्यकता नहीं है। debugInfoRec.cpp को देखो: ध्वज सेट नहीं है

static inline bool compute_recording_non_safepoints() { 
    if (JvmtiExport::should_post_compiled_method_load() 
     && FLAG_IS_DEFAULT(DebugNonSafepoints)) { 
    // The default value of this flag is taken to be true, 
    // if JVMTI is looking at nmethod codes. 
    // We anticipate that JVMTI may wish to participate in profiling. 
    return true; 
    } 

    // If the flag is set manually, use it, whether true or false. 
    // Otherwise, if JVMTI is not in the picture, use the default setting. 
    // (This is true in debug, just for the exercise, false in product mode.) 
    return DebugNonSafepoints; 
} 

हैं, डिबग जानकारी अभी भी दर्ज की गई है जब JVMTI CompiledMethodLoad सूचनाएं सक्षम हैं। आपको बस can_generate_compiled_method_load_events क्षमता का अनुरोध करने की आवश्यकता है और JVMTI_EVENT_COMPILED_METHOD_LOAD सूचनाएं चालू करें।

यह ठीक है कि मैं इसे अपने async-profiler प्रोजेक्ट में कैसे संभालता हूं।


रन-टाइम में अप्रबंधनीय जेवीएम ध्वज बदलने का कोई सुरक्षित तरीका नहीं है। हालांकि, लिनक्स पर ऐसा करने के लिए एक बदसूरत हैक है।

  1. libjvm.so का मूल पता खोजने के लिए /proc/self/maps पढ़ें।
  2. गतिशील पुस्तकालय में वांछित प्रतीक के ऑफसेट की खोज के लिए ELF format reader का उपयोग करें।
  3. सीधे इस प्रतीक के पते पर लिखें।

इस चाल के लिए a sample code है।

+0

मैंने इसे हेल्फी (और हॉटस्पॉट एसए के साथ भी) के माध्यम से प्रबंधित किया था। जब मैं इसे –

+1

तैयार करता हूं तो मैं इसे नमूना कोड के साथ दिखाऊंगा, यह https://github.com/serkan-ozal/jvm-playground/blob/master/src/main/java/tr/com/serkanozal/jvm/ है खेल का मैदान/बदलें ImmutableVmFlagDemo.java –

+0

@ SerkanÖzal कूल! ऐसा नहीं लगता था कि इसके लिए हेल्फी का इस्तेमाल किया जा सकता था। क्या आप इस उदाहरण को जिथब पर हेल्फी रेपो में जोड़ना चाहते हैं? – apangin

1

ठीक है, यह एक सटीक जवाब लेकिन कुछ दिशा में एक कुहनी से हलका धक्का के और अधिक नहीं है ....

services/writeableFlags.hpp में वी एम झंडे की स्थापना के लिए स्थिर तरीके हैं। सफलता इस बात पर निर्भर करेगी कि ये झंडे वास्तव में उत्परिवर्तनीय हैं लेकिन यह चारों ओर घूमने के लिए एक अच्छी जगह होगी। मैंने JVMTI एजेंट से इन विधियों को कॉल करने का प्रयास नहीं किया है, लेकिन सैद्धांतिक रूप से, इसे काम करना चाहिए।

1

कुछ जेवीएम झंडे हैं जिन्हें रनटाइम पर com.sun.management.HotSpotDiagnosticMXBean.setVMOption का उपयोग करके लिखा जा सकता है।

(एक सूची के लिए http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/b92c45f2bc75/src/share/vm/runtime/globals.hpp देखें और manageable के लिए खोजें)।

दुर्भाग्य से आपके उपयोग के मामले में विकल्प UnlockDiagnosticVMOptions लिखने योग्य नहीं है।

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