2012-10-18 3 views
5

में एएसएम का उपयोग कर ऑब्जेक्ट क्रिएशन क्रिएशन I जावा में ऑब्जेक्ट सृजन की निगरानी के लिए एएसएम का उपयोग कर रहा हूं। वर्तमान में, मैं कॉल init करने के लिए एक नई वस्तु और साधन एक कार्यक्रम के निर्माण के संकेत के रूप में सेजावा

invoke XXX.init 

dup; 
invoke XXX.init; 
call_my_method(Object) 

मेरा विचार करने के लिए ले जाता है newObjectReference की एक प्रति नकल करने और , इस ऑब्जेक्ट के init के बाद, मैं इस ऑब्जेक्ट को रखने के लिए अपनी विधि को कॉल करता हूं।

java.lang.VerifyError, Expecting to find unitialized object on stack. 

जब मैं इस्तेमाल किया "-noverify" विकल्प, रनटाइम के दौरान, अगर वहाँ एक धागा उदाहरण है, एक दूसरे अपवाद:

Exception in thread "main" java.lang.IllegalThreadStateException 
at java.lang.Thread.start(Unknown Source) 
at test.ThreadTest.test 

हालांकि, रनटाइम के दौरान, वहाँ एक अपवाद है

दूसरे मामले के लिए, मुझे यकीन है कि मूल प्रोग्राम में छोड़कर () शुरू करने के लिए कोई कॉल नहीं है।

क्या नया ऑब्जेक्ट निर्माण की निगरानी करने का कोई बेहतर तरीका है?

बहुत बहुत धन्यवाद।

+0

मुझे लगता है कि आप आवंटन की निगरानी के लिए मेमोरी प्रोफाइलर का उपयोग नहीं कर सकते हैं। एक बार आपके पास यह डेटा हो जाने के बाद आपको इसे देखने का एक तरीका भी चाहिए। जैसे http://www.yourkit.com/docs/11/help/allocations.jsp –

+0

क्या आप 'call_my_method (ऑब्जेक्ट)' के लिए उपयोग कर रहे सटीक बाइटकोड निर्देश प्रदान कर सकते हैं? – vijay

+0

टिप्पणियों के लिए धन्यवाद। मैंने भूल की। मैंने माना है कि 'init' का एकमात्र तर्क नव निर्मित वस्तु है, इसलिए 'डुप्ली' का उपयोग करके 'init' के बाद इस ऑब्जेक्ट पर जा सकता है। हालांकि, मैंने पाया कि, 'init' से ठीक पहले, कुछ अन्य ऑब्जेक्ट हो सकता है जो कि नव निर्मित वस्तु को 'प्रारंभ करने' के लिए उपयोग किया जाने वाला तर्क है। यही कारण है कि मैं दो अपवादों से ऊपर था।इसे 'थ्रेड टी = नया थ्रेड (नया ARunnableClass())' या अन्य समान ऑब्जेक्ट निर्माण विधियों के बाइटकोड में सत्यापित किया जा सकता है। ऑब्जेक्ट सृजन की निगरानी करने के लिए मुझे कुछ वैकल्पिक तरीकों की आवश्यकता है। –

उत्तर

4

प्रयास करें, परिवर्तित

invoke XXX.init;
dup;
call_my_method(Object)

को XXX.init आह्वान मूल रूप से init विधि रिटर्न के बाद डुप्लीकेट कहते हैं।

स्पष्टीकरण :: इसलिए दिया गया है कि आप नई ऑब्जेक्ट रचनाओं को ट्रैक करना चाहते हैं, मुझे लगता है कि आप नए XXX() जैसे बयान देख रहे हैं। अब, जिस तरह से इस बाईटकोड के लिए अनुवाद इस प्रकार है: -

NEW XXX
DUP
INVOKESPECIAL <init>

दूसरे शब्दों में, नई बाईटकोड अनुदेश वस्तु ही बनाने के लिए प्रयोग किया जाता है। यह ढेर के शीर्ष पर डुप्लिकेट किया गया है, इसलिए आपके पास ऑब्जेक्ट की एक अतिरिक्त प्रति है। इस बिंदु पर आप ध्यान दें, वस्तु की 2 प्रतियां अनियमित हैं। और फिर स्टैक के शीर्ष पर पहली अनियमित वस्तु पर इनिट विधि लागू की जाती है। जब तक कन्स्ट्रक्टर लौटाता है, ऑब्जेक्ट प्रारंभ होता है, और इस प्रकार स्टैक के शीर्ष पर बैठे ऑब्जेक्ट को भी प्रारंभ किया जाता है। (ऐसा इसलिए है क्योंकि स्टैक के शीर्ष पर बैठे "ऑब्जेक्ट" वास्तव में एक ऑब्जेक्ट संदर्भ है जो ढेर पर कहीं भी बैठे वास्तविक वस्तु को इंगित करता है। मैं ऑब्जेक्ट संदर्भ के बजाय ऑब्जेक्ट शब्द का उपयोग करता हूं क्योंकि चीजों को समझाना आसान है। क्षमा करें अगर इससे कोई भ्रम पैदा हुआ।)

+0

फिर से धन्यवाद। मैंने यह भी एक संभावित तरीका पाया हालांकि यद्यपि कुछ नया 'init' 'नया' है। मेरा दूसरा विचार 'Object.init' की निगरानी करना है क्योंकि यह संभव है कि प्रत्येक नई वस्तु का प्रारंभिकरण 'ऑब्जेक्ट' के 'init' को आमंत्रित करेगा। –

+0

yup ... ऑब्जेक्ट ट्रैकिंग। वास्तव में इसके बारे में जाने का एक शानदार तरीका है .. साझा करने के लिए धन्यवाद :) इसके अलावा, अगर आपको कोई समाधान समाधान मिल जाए, तो इसे यहां पोस्ट करें। एक बार फिर धन्यवाद :) – vijay