2010-07-14 11 views
19

में अपने स्वयं के अनुप्रयोग विधियों को नहीं देख सकता है, मैं अपने जावा ऐप को प्रोफाइल करने का प्रयास कर रहा हूं, बस उन तरीकों को जानने के लिए जिनमें अधिकतर समय व्यतीत किया जा रहा है। टीपीटीपी को यहां खराब प्रतिक्रियाओं को देखते हुए, मैंने सोचा कि मैं जावा विजुअलVM को एक दूंगा।जावा VisualVM

यह सब उपयोग करने के लिए अपेक्षाकृत आसान लग रहा था - सिवाय इसके कि मुझे कुछ भी संगत या उपयोगी नहीं लग रहा है।

मुझे अपने स्वयं के कोड से संबंधित कुछ भी दिखाई नहीं दे रहा है - मुझे लगता है कि जावा जैसे चीजों को कॉल का पूरा समूह है। * विधियां।

मैंने केवल अपने स्वयं के पैकेजों के लिए वाद्ययंत्र को प्रतिबंधित करने का प्रयास किया है, जो कि विधियों की संख्या को कम करने लगता है, लेकिन फिर भी मुझे कभी भी खुद को नहीं दिख रहा है।

प्रत्येक बार जब मैं दौड़ता हूं, तो मुझे 10 से 1000 के बीच के विभिन्न तरीकों का साधन मिल जाता है। मैंने अपने ऐप की शुरुआत में नींद डालने का प्रयास किया है, यह सुनिश्चित करने के लिए कि मुझे विजुअलVM मिल जाए और मेरे ऐप को दिलचस्प कुछ भी करने से पहले चलाना शुरू हो जाए, यह सुनिश्चित करने के लिए कि दिलचस्प सामग्री चल रही है तो यह प्रोफाइलिंग हो रही है।

क्या मेरे वर्गों को वाद्ययंत्र प्राप्त करने के लिए मुझे कुछ करना है? क्या समय मुद्दे हैं? .. जैसे, वर्गों को लोड करने के लिए इंतजार करना है आदि? मैंने यह सुनिश्चित करने के लिए कोड को दो बार चलाने की कोशिश की है कि सभी कोड का उपयोग किया जाता है ...

मैं सिर्फ ग्रहण से मुख्य के साथ एक ऐप चला रहा हूं। मैंने एक्लिप्स एकीकरण का उपयोग करने का प्रयास किया है ताकि जब मैं ऐप शुरू करता हूं तो विजुअलVM शुरू होता है - परिणाम समान होते हैं। मैंने ऐप को एक रननेबल ऐप के रूप में निर्यात करने का प्रयास किया है, और इसे ग्रहण के बजाए कमांड लाइन से स्टैंडअलोन चला रहा है - एक ही परिणाम।

मेरा ऐप एक लंबे समय तक चलने वाला वेब ऐप आदि नहीं है - केवल एक मुख्य जो कुछ अन्य प्रसंस्करण करने के लिए अपने कुछ वर्गों को कॉल करता है, फिर छोड़ देता है।

मैं किसी भी सलाह के लिए आभारी हूं कि मैं क्या गलत कर रहा हूं! :)

धन्यवाद!

+0

मुझे नहीं पता कि इससे कोई फर्क पड़ता है, लेकिन क्या आपने बिना किसी डीबग जानकारी के अपने आवेदन को संकलित किया है? या आपका आवेदन कस्टम क्लासलोडर का उपयोग करता है? –

+0

एक छोटी सी सिखाई गई लेकिन सरल और प्रभावी तकनीक है: http://stackoverflow.com/questions/266373/one-could-use-a-profiler-but-why-not-just-halt-the-program/317160# 317160 –

उत्तर

0

मुझे लगता है कि यह सिर्फ एक अकादमिक प्रश्न नहीं है - आप देखना चाहते हैं कि आप ऐप को तेजी से चला सकते हैं या नहीं। मुझे लगता है कि आप थोड़ा "बॉक्स से बाहर" सोच भी नहीं पाएंगे। प्रदर्शन के बारे में कई लोकप्रिय विचार हैं जो वास्तव में बहुत अस्पष्ट हैं।

उदाहरण के लिए, आप कहते हैं कि आप "विधियों में अधिकतर समय व्यतीत किए जा रहे हैं" की तलाश में हैं। यदि इसका मतलब है कि आपका मतलब है "स्वयं समय" (वास्तव में विधि में प्रोग्राम काउंटर) शायद बहुत कम है, जब तक कि आपको कुछ तीव्र लूप नहीं मिल जाते। तरीके आमतौर पर अन्य विधियों को कॉल करके समय बिताते हैं, कभी-कभी I/O करते हैं।

एक और अस्पष्ट विचार यह है कि मापने का समय या कॉल की संख्या की गणना करने से आप कहां बाधाओं के बारे में बहुत कुछ बता सकते हैं। Bottlenecks कोड की विशिष्ट रेखाएं हैं, तरीकों से नहीं, इसलिए यदि आप जानते हैं कि कहां देखना है, तो भी आप जासूसी कर रहे हैं।

तो ये कुछ अस्पष्ट विचार हैं। Here is a bunch more. मुझे सुझाव दें कि कैसे इसके बारे में सोचें, और इससे परिणाम कैसे निकलते हैं।

जब आप अंततः कुछ ठीक करते हैं, तो यह कुछ प्रतिशत (निष्पादन संख्या) 30% के साथ निष्पादन समय को कम करेगा, है ना? (अन्यथा आपने कुछ भी ठीक नहीं किया।) ठीक है, उस 30% के दौरान यह कुछ कर रहा था, ऐसा कुछ जिसे करने की ज़रूरत नहीं थी क्योंकि बाद में आप इससे छुटकारा पा लिया।तो, आप को मापने की आवश्यकता नहीं है। को उस समय पता लगाने की आवश्यकता है कि यह उस समय क्या कर रहा है, इसलिए आप जानते हैं कि इससे छुटकारा पाने के लिए क्या करना है।

यादृच्छिक रूप से इसे 10 (या कुछ संख्या) बार "रोकें" का एक बहुत ही आसान तरीका है। समझें कि यह क्या कर रहा है और क्यों, कॉल स्टैक और संभवतः कुछ डेटा देखकर। उन 3 में से 3 बार आप इसे ऐसा कुछ कर पाएंगे जिससे आप छुटकारा पा सकते हैं।

आपको लगभग पता चल जाएगा कि नमूने का प्रतिशत यह दिखाकर कितना बचाएगा। अनुमान काफी अच्छा है। आप आसानी से देख सकते हैं कि पहले और बाद में इसे रोककर कितना समय बचाया जाता है।

फिर, रुको मत। आपने ऐप को तेज़ी से बनाया है। इसे फिर से करें, और इसे अभी तक तेज बनाएं। जल्द या बाद में आप उस बिंदु पर पहुंच जाते हैं जहां आप इसे तेज़ी से नहीं बना सकते हैं, लेकिन शायद यह एक से अधिक चरणों में है।

1

आप एपडाइनेमिक्स लाइट पर एक नज़र डाल सकते हैं, इसमें व्यापार लेनदेन की खोज जैसी अच्छी सुविधाएं हैं जो आपके कोड में किसी विशिष्ट विधि से किए गए सभी कॉल का नमूना दे सकती हैं।

लाइट संस्करण में बहुत सी सीमाएं हैं जैसे 10min नमूना अधिकतम और 30 व्यावसायिक लेनदेन खोज अधिकतम।

यह एक नि: शुल्क उपकरण है कि ऐसा ही

5

मैं भी VisualVM है, जो एक शर्म की बात है, क्योंकि अपने यूजर इंटरफेस शानदार है, जबकि इसकी रूपरेखा उत्पादन भीषण लगता है के साथ संघर्ष कर रहा हूँ के लिए अच्छा होगा है। आप यहां मेरा प्रश्न प्रतीत कर सकते हैं।

Java VisualVM giving bizarre results for CPU profiling - Has anyone else run into this?

मैं तुम्हें अजीब चीजें हैं जो मैं VisualVM और जिस तरह से वह अपने रूपरेखा कर रहा है के बारे में सीखा है की एक जोड़ी बता सकते हैं।

विजुअलVM एक विधि (दीवार घड़ी के समय) के भीतर बिताए गए कुल समय की गणना कर रहा है। मेरे पास मेरे आवेदन में एक धागा है जो कई अन्य धागे शुरू करता है और फिर तुरंत कतार पर एक संदेश के लिए इंतजार कर रहा है। VisualVM प्रोफाइलर में इस विधि को पंजीकृत नहीं करेगा जब तक कि अन्य थ्रेड्स में से एक संदेश संदेश भेजता है जब पहला थ्रेड इंतजार कर रहा था (जब एप्लिकेशन समाप्त हो जाता है)। अचानक ब्लॉकिंग विधि कॉल प्रोफाइलिंग आउटपुट पर हावी है और आवेदन समय के 80% से अधिक के रूप में दर्ज किया गया है।

अन्य प्रोफाइलर, जैसे जेपीरोफाइलर और अज़ुल द्वारा उपयोग किए जाने वाले एक को प्रोफाइलर के लिए समय निकालने के रूप में अवरुद्ध धागा की गणना नहीं होती है। इसका मतलब यह है कि प्रदर्शन प्रोफाइलिंग के लिए संभवतः रोचक विधियां (स्थिति निर्भर) नहीं हैं जो आपके सीपीयू समय को खाने वाले कोड के बारे में आपके विचार को अस्पष्ट कर रहे हैं।

जब मैं अपने रूपरेखा मैं

sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run()

अंत मेरी रूपरेखा अधिकार obscuring चला रहा हूँ जब तक कि संदेश प्रतीक्षा करने के लिए वापस आता है धागा और फिर शीर्ष स्थान को इन दो पूरी तरह से अप्रासंगिक विधियों के साथ-साथ कई अन्य अनौपचारिक तरीकों के बीच साझा किया जाता है जो अन्य प्रोफाइलरों पर दिखाई नहीं देते हैं।

दूसरा और मुझे लगता है कि विधि फ़िल्टरिंग तंत्र काम नहीं करता है जैसा कि मैंने अपेक्षा की थी।इसका मतलब है कि मैं फ़िल्टर नहीं कर सकता हूं, मैं इस बात को ट्रैक करने की कोशिश कर रहा हूं कि इस कहानी के साथ अभी क्या है।

वास्तव में कोई उपयोगी उत्तर नहीं है। जिस समाधान को मैं अभी देखता हूं वह जेपीरोफाइलर के लिए भुगतान करना है - विजुअलVM सिर्फ इस कार्य के लिए भरोसेमंद नहीं लगता है।

+0

मुझे एक ही समस्या है @ francis-stephens के रूप में अभी तक एक समाधान पता लगाने में सक्षम नहीं है –

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