2010-03-08 14 views
10

वहाँ माणिक में किसी भी तरह की वस्तुओं की स्मृति पता पाने के लिए है ..रूबी में ऑब्जेक्ट मेमोरी एड्रेस एक्सेस करना ..?

कहना ..

(i = 5) कि उस वस्तु 5 मेम का पता पाने के लिए संभव है ..

मैं कुछ समय के साथ इस प्राप्त करने की कोशिश की गई है ..,

किसी भी सवाल का जवाब वास्तव में सराहना की है ...

धन्यवाद,

सादर levirg

+10

क्यों? तुम क्या करने की कोशिश कर रहे हो? – SLaks

उत्तर

3

मुझे सही पता रखने का कोई तरीका नहीं पता, लेकिन शायद आप object_id विधि जैसी कुछ ढूंढ रहे हैं?

अपने documentation

से

निकालें रिटर्न obj के लिए एक पूर्णांक पहचानकर्ता।
एक ही नंबर एक दिया वस्तु के लिए आईडी के लिए सभी कॉल पर वापस कर दी जाएगी, और कोई दो सक्रिय वस्तुओं एक आईडी

साझा करेंगे

उदाहरण:

> 5.object_id 
=> 11 
> true.object_id 
=> 2 
7

Ruby Memory Validator में सक्षम होना चाहिए इसे खींचने के लिए लेकिन यह मुफ़्त नहीं है।

अमन गुप्ता patched जो दमाटोस memprof लेकिन यह work in progress लगता है और मुझे इसे कभी भी मेरी मशीन पर चलाने के लिए नहीं मिला। जो के blog पर memprof और अन्य निम्न स्तर की सामग्री के बारे में वास्तव में अच्छी पोस्ट हैं।

अब मुझे यकीन नहीं है कि वे वास्तव में कर सकते हैं। इंटीग्रर्स को Fixnum और Fixnum के रूप में संग्रहीत किया जाता है, सामान्य रूबी ऑब्जेक्ट नहीं होता है, यह बस उस तरह दिखता है। Fixnum वस्तुओं को immidiate मान बनाने के लिए रूबी object_id के साथ एक चालाक गति अप चाल का उपयोग करता है। वास्तव में यह संख्या object_id में संग्रहीत है। यही कारण है कि एक ही मूल्य वाले दो अलग-अलग फ़िक्सम में object_id समान है।

>> x=5 
=> 5 
>> y=5 
=> 5 
>> x.object_id 
=> 11 
>> y.object_id 
=> 11 
>> z=4711 
=> 4711 
>> z.object_id 
=> 9423 

एक Fixnum की object_id वास्तव में थोड़ा बाईं ओर स्थानांतरण और फिर कम से कम महत्वपूर्ण बिट की स्थापना द्वारा बनाई गई है।

50b101 है और 5 के लिए object_id11 और 11 बाइनरी में 0b1011 है।

47110b0001001001100111 है, छोड़ दिया शिफ्ट और बिट सेट और आप 0b0010010011001111 हो और कि 9423 जो ऊपर z के लिए object_id होने वाला है।

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

रूबी में कम से कम तीन और तत्काल वस्तुओं रहे हैं और कहा कि false, true और nil है।

>> false.object_id 
=> 0 
>> true.object_id 
=> 2 
>> nil.object_id 
=> 4 
+0

ऐसा लगता है कि 64 बिट के लिए मेमप्रोफ wroks अच्छा है, मेरा 32 बिट है ..... धन्यवाद – levirg

+0

धन्यवाद, मुझे याद आया कि memprof के लिए रीडेमे में। मैं 32-बिट पर भी हूं। एक स्पष्टीकरण के लिए ऊपर देखें कि कैसे रूबी फिक्सनम स्टोर करता है। –

+0

जो बहुत अच्छा था, मैंने उससे कुछ सीखा है ... धन्यवाद आदमी .. – levirg

0

वास्तव में आप क्या करने की कोशिश कर रहे हैं?

ध्यान रखें कि एक रूबी वस्तु सीधे सी या सी ++ की तरह एक भाषा में एक चर के अनुरूप नहीं है रखें। उदाहरण के लिए:

a = "foo" 
b = a 
b[2] = 'b' 
b 
    => "fob" 
a 
    => "fob" 
a == b 
    => true 
a.object_id 
    => 23924940 
b.object_id 
    => 23924940 
a.object_id == b.object_id 
    => true 

भी a के माध्यम से और b अलग चर रहे हैं, वे समान ही अंतर्निहित डेटा के लिए संदर्भ और एक ही object_id है।

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

+0

मैं सिर्फ जानना चाहता था कि ऑब्जेक्ट्स को संदर्भित करने के लिए रूबी पर काम कैसे किया जाता है, इसलिए मैंने सोचा कि पता उपयोगी होगा, काम करने के लिए ..... अगर कृपया कोई बेहतर तरीका है कृपया मेरी मदद करें ... धन्यवाद – levirg

+0

आपको रूबी में किसी ऑब्जेक्ट को संदर्भित करने के बारे में चिंता करने की आवश्यकता नहीं है। अन्य भाषाओं के विपरीत जहां आप किसी ऑब्जेक्ट को मूल्य या संदर्भ से पास कर सकते हैं, रूबी आपके लिए सभी निम्न-स्तरीय पहलुओं को संभालती है। आपको बस इतना करना होगा कि ऑब्जेक्ट का उपयोग करें और इसे चारों ओर पास करें जैसे कि आप सी में मूल्य से गुज़र रहे थे। रूबी के आंतरिक के बारे में अधिक जानकारी के लिए, http://www.ruby-doc.org/docs/ देखें ProgrammingRuby/language.html। – bta

1

Ruby Memory Validator आप वस्तु के लिए स्मृति का पता देता है।

जो Damato के काम (http://timetobleed.com/plugging-ruby-memory-leaks-heapstack-dump-patches-to-help-take-out-the-trash) और (http://timetobleed.com/memprof-a-ruby-level-memory-profiler) काम सॉफ्टवेयर सत्यापन एक रूबी स्मृति निरीक्षण एपीआई (http://www.softwareverify.com/ruby/customBuild/index.html) बनाने के लिए किया था पर आधारित है।

जो अपने ब्लॉग पर वर्णन करता है। इसलिए जो के काम को उपयुक्त पते भी वापस करना चाहिए। मैं जो के काम के नवीनतम संस्करण के साथ पूरी तरह से गति से नहीं हूं - उसने मुझे केवल पहले संस्करण के बारे में बताया, न कि नवीनतम संस्करण, लेकिन फिर भी, यदि आप रूबी के आधार पर स्मृति आवंटन को ट्रैक कर रहे हैं, तो आप पते पर नज़र रख रहे हैं उन ऑब्जेक्ट्स जो आपके पास आवंटित किए जा रहे हैं।

यही मतलब यह नहीं है कि आप पता भिन्नता कर सकते हैं और आप उस पते पर पाने की उम्मीद डेटा मान पढ़ें। पते को संदर्भित करने से आपको मूल रूबी ऑब्जेक्ट के आंतरिक भाग मिलेंगे। रूबी ऑब्जेक्ट्स एक मूल वस्तु होती है जो उसके बाद अतिरिक्त डेटा स्टोर करती है, इसलिए वास्तविक पता जानना बहुत उपयोगी नहीं है जब तक आप रूबी मेमोरी वैलिडेटर या मेमप्रोफ जैसे टूल लिख रहे हों।

मैं कैसे रूबी मेमोरी सत्यापनकर्ता और एपीआई हम जारी किया गया के बारे में ऊपर में पता है? मैंने रूबी मेमोरी वैलिडेटर डिज़ाइन किया। मैंने असेंबली भाषा बिट्स भी लिखीं जो रूबी कॉल को रोकती हैं जो स्मृति आवंटित करती हैं।

0

इंगित जब से तुम (एक टिप्पणी कहीं में दफन) आप वास्तव में सिर्फ समझने के लिए रूबी का संदर्भ चीजों की कोशिश कर रहे, मैं चीजों को इस प्रकार के रूप में काम लगता है:

रूबी के सी API में एक VALUE एक वस्तु का प्रतिनिधित्व करता है (एक nil, FixNum या Boolean) या Object पर पॉइंटर। VALUE में एक 3 बिट टैग है जो दर्शाता है कि इनमें से कौन सा है, और इसमें मान (पहले 3 के लिए) या प्रत्यक्ष मेमोरी पॉइंटर (Object के लिए) शामिल है। VALUE पर सीधे रूबी में जाने का कोई तरीका नहीं है, (मुझे यकीन नहीं है कि object_id समान या अलग है।)

ध्यान दें कि जेआरबीई अलग-अलग काम करता है।

9

हां।

"स्मृति आप ऑब्जेक्ट id लेने, और छोड़ दिया करने के लिए एक बिटवाइज़ पारी करके किसी वस्तु की वास्तविक सूचक मूल्य प्राप्त कर सकते हैं यह आपको सूचक दे ​​देंगे (या:।

" Fiddling with Ruby’s Fiddle "से

स्थान) स्मृति में रूबी ऑब्जेक्ट का। "

i = 5 के अपने उदाहरण यह इतना की तरह किया जा सकता है का उपयोग करना:

i = 5 
i_ptr_int = i.object_id << 1 
=> 22 

"In Ruby, why does inspect() print out some kind of object id which is different from what object_id() gives?" अधिक जानकारी के बारे में object_id, कार्यान्वयन जो उपयोगी हो सकते अंतर्निहित सी स्रोत के लिए एक संक्षिप्त परिचय सहित ।

कुछ अन्य शांत चीजों के लिए "Fiddle" पर एक नज़र डालें।

+0

यह सुनिश्चित नहीं है कि यह उत्तर अधिक वोट क्यों नहीं दिया गया है, यह बहुत मदद करता है! यदि आपके पास 'foo = class.new' है तो 'foo.to_s' कुछ ऐसा करता है जैसे" # <कक्षा: 0x007fa49c09e0a0> "। रूबी स्रोत कोड को देखते हुए, यह स्ट्रिंग @tmp_classpath को असाइन की जाती है। हालांकि, एक बार जब आप इस ऑब्जेक्ट को स्थिर पर असाइन करते हैं, तो 'Foo = foo',' foo.to_s' रिटर्न "Foo", और @tmp_classpath हटा दिया जाता है। मैंने लगातार असाइनमेंट के पहले और बाद में संदेशों को डीबग किया है, और अब इन्हें जोड़ने के लिए '(foo.object_id << 1) .to_s (16)' का उपयोग कर सकते हैं। – fastryan

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