2010-05-11 14 views
7

काम पर हमने पाया कि कुछ मामलों (धीमे लोगों को कण) पर हमारे पास एक अलग व्यवहार है, जो रिबूट पर अधिग्रहित होता है।क्या हम जेवीएम मेमोरी में ऑब्जेक्ट्स देख सकते हैं?

हमें लगता है कि एक कैश सही ढंग से शुरू नहीं किया गया है, या शायद एक सहमति समस्या ... वैसे भी यह उत्पादन के किसी अन्य env में पुनरुत्पादित नहीं है।

हम वास्तव में सक्रिय करने के लिए वालों की जरूरत नहीं है ... यह एक पुराने घटक है ...

इस प्रकार मुझे पता करना चाहते हैं तो वहाँ उपकरण है कि हमें में मौजूद विभिन्न objets देखने के लिए मदद कर सकते हैं कैश की सामग्री की जांच करने के लिए जेवीएम मेमोरी ...

धन्यवाद!

संपादित करें:

मैं उत्पादन सर्वर के लिए पहुँच नहीं है सीधे, हमारे अनुप्रयोग सर्वर weblogic 10 है, मैं वस्तु के लिए एक सूचक नहीं है, लेकिन मैं कैश ऑब्जेक्ट प्रकार जानते हैं .. ।

EDIT2:

हमारे सर्वर JRE 1.5 पर चल रहे हैं, यह jmap उपयोग करना संभव है? यह एक jdk5 में नहीं खोजा जा सका :( इसके अलावा, दूरस्थ डीबगिंग अच्छा हो सकता है, लेकिन हम नहीं कर सकते सुरक्षा कारणों से ...

Edit3:

असल jhat + VisualVM मेरे लिए ठीक है, मैंने अपना ऑब्जेक्ट डंप में पाया लेकिन मैं हैशप (ऑब्जेक्ट 60000 आइटम वाली वस्तु) को पढ़ने में सक्षम नहीं हूं ... क्या एक दोस्ताना तरीके से एक concurrenthashmap पढ़ने के लिए कोई उपकरण है? मुझे एक कुंजी का मूल्य ढूंढना होगा (या मानचित्र में इसका अस्तित्व) मैन्युअल रूप से 60k रिकॉर्ड ब्राउज़ किए बिना। असल में मैं ग्रहण मैट फोरम पर पढ़ता हूं कि यह भी संभव नहीं है ...

संपादित 4: कुछ अनुभवों के बाद मुझे वास्तव में VisualVM जैसे टूल पसंद हैं। आपकाकिट भी इस्तेमाल किया। ओक्यूएल जैसी कुछ उपयोगी विशेषताएं हैं जिन्हें आपको देखने के लिए आवश्यक सही उदाहरण मिलते हैं ...

+0

मुझे किसी प्रकार के पॉइंटर/परिवर्तनीय संदर्भ के बिना ऑब्जेक्ट तक पहुंच प्राप्त करने का कोई तरीका नहीं पता है। – aperkins

उत्तर

6

यह मूल रूप से विस्तारित करने के लिए क्या होगा। हमारे व्यवस्थापक हमारे उत्पादन प्रणालियों का एक हेपडम्प करते हुए मुझे बड़ी सफलता मिली है, हालांकि चेतावनी के साथ कि आप जिस विशेष सर्वर को डंप कर रहे हैं, वह डंप पूर्ण होने तक गैर-प्रतिक्रियाशील होगा। फिर उस फ़ाइल को प्राप्त करने और ग्रहण करने के लिए ग्रहण मैट प्लगइन का उपयोग करके। यदि आपको ग्रहण पसंद नहीं है, नेटबीन्स और सादे VisualVM प्लगइन का भी उपयोग किया जा सकता है। हालांकि यह कुछ बड़ी फाइलें बना सकता है, आपको 64 बिट सिस्टम पर चलने की आवश्यकता हो सकती है।

+1

+1 - इमो सबसे शक्तिशाली (फ्री) ढेर विजुअलाइज़र वहां से बाहर है। अत्यधिक अनुशंसित, और दिलचस्प तरीके से ढेर को देखने के लिए शानदार प्लगइन हैं (उदाहरण के लिए संग्रह भरें%, उदाहरण के लिए!)। – ykaganovich

+0

+1 के लिए –

3

क्या आपके पास ऑब्जेक्ट्स को हैंडल/पॉइंटर तक पहुंच है? यदि ऐसा है, तो आप इसे डीबग मोड में फायर कर सकते हैं, और इसे ग्रहण जैसे डीबगर में देख सकते हैं। यह आपको चर और इसी तरह की जांच करने की अनुमति देगा।

वैकल्पिक रूप से, आप एक छोटे से लॉगर लिख सकते हैं जो प्रतिबिंबित रूप से कक्षा के माध्यम से चलता है और लॉग ऑन करता है कि क्या हो रहा है। यह सब मानता है कि आपके पास एक स्थान है जहां आप कोड में कदम उठाना शुरू कर सकते हैं, या कैश किए गए मानों का संदर्भ प्राप्त कर सकते हैं।


संपादित करें: जैसा कि मैंने मेरी टिप्पणी में बताया गया है, मैं एक तरह से संदर्भ या संदर्भ के लिंक के कुछ प्रकार के बिना एक वस्तु पर पहुंच प्राप्त करने का पता नहीं है। उदाहरण के लिए, वस्तु किसी अन्य वस्तु में encapsulated है?यदि हां, तो आप की तरह कुछ कर सकते हैं निम्नलिखित:

Class<?> objectClass = myPointer.getClass(); 
Field[] objectFields = objectClass.getDeclaredFields(); 
for (Field field : objectFields) { 
    field.setAccessible(true); 
    //Or whatever you would need to do to get the information you need 
    System.out.println(field.get(myPointer).toString()); 
} 

तुम भी कुछ ऐसा कर सकते हैं:

Field targetField = objectClass.getDeclaredField("myFieldName"); 
targetField.setAccessible(true); 
MyOldObjectType target = (MyOldObjectType)targetField.get(myPointer); 
//do whatever you need to do here 

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

+0

मुझे नहीं लगता कि एक्लिप्स में मौजूद एक डीबगर एक विकल्प है क्योंकि "यह उत्पादन के मुकाबले किसी भी अन्य env में पुन: उत्पन्न नहीं है।" –

+1

@Andrew Hubbs: मैंने व्यक्तिगत रूप से उत्पादन वातावरण में ग्रहण डीबगिंग का उपयोग किया है - आपको सिस्टम को डीबग मोड में शुरू करना होगा, और इसे दूरस्थ कनेक्ट पर सेट करना होगा। वहां विकल्प हैं - यह आसान नहीं है, लेकिन यह संभव है। – aperkins

+0

हमारे सर्वर एक ही शहर में नहीं हैं, मुझे नहीं पता कि वे डीबग मोड में एक उत्पादन वेबलॉगिक शुरू कर सकते हैं, और नहीं जानते कि वे मुझे सुरंग के माध्यम से पहुंच प्रदान करेंगे ... –

4

यह वस्तु आवृत्तियों की गणना करने के लिए डंप jmap चलाने के लिए काफी आसान है, लेकिन अगर यह है कि आप वास्तव में क्या में रुचि रखते हैं मैं नहीं जानता।

तुम भी का एक ढेर डंप करने के लिए jmap उपयोग कर सकते हैं पूरे ढेर, और उस (और झट) के साथ, आप ऑब्जेक्ट रिलेशनशिप (यानी क्या ऑब्जेक्ट इंगित करता है) देख सकते हैं, लेकिन जरूरी नहीं कि सामग्री को ऑब्जेक्ट करें।

निश्चित रूप से डेटा ढेर डंप में है, यह दृश्यमान "दूर क्लिक" नहीं है।

मुझे लगता है कि कुछ पेशेवर प्रोफाइलर आपको एक ढेर डंप में वस्तुओं का आत्मनिरीक्षण करने देंगे।

कहीं भी आप उस विशिष्ट आत्मनिरीक्षण को प्रदान करने के लिए एप्लिकेशन में कुछ विशिष्ट उपकरण जोड़ने से बेहतर होंगे, जो कस्टम कोड, जेएमएक्स, या जो भी हो, द्वारा ट्रिगर किया गया है।

+0

+1 - मुझे ढेर डंप के बारे में पता नहीं था। यह मेरे लिए एक या दो महीने पहले वास्तव में उपयोगी होता :) :) – aperkins

+0

हम जावा 1.5 का उपयोग करते हैं क्या 1.5 जेआर पर जेएमएपी का उपयोग करना संभव है? मुझे jdk6 पर jmap मिला है और यह मेरे स्थानीय जेरे 1.5 के साथ काम नहीं कर सका ...Eclipse MAT के लिए VisualVM –

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