2009-05-17 17 views
11

मेरे पास एक प्रश्न हैआवंटित परिवर्तनीय संदर्भ कहां है, ढेर में या ढेर में?

उदाहरण के लिए जब मैं एक चर के अंदर एक चर घोषित करता हूं तो क्या खुशी होती है।

 
void myMethod() { 
    Ship myShip = new Ship(); 
} 

स्टैक या ढेर में, मेराशिप संदर्भ आवंटित किया गया है?

मैं ढेर में लगता है, लेकिन मैं उलझन में हूँ क्योंकि मैं जे 2 एमई खेल प्रोग्रामिंग किताब में पढ़ रहा था

सभी जावा clases "जावा वर्गों जावा ढेर पर instantiated कर रहे हैं?"

अग्रिम धन्यवाद

+0

यह प्रश्न थोड़ा अस्पष्ट है। यह या तो "स्मृति में संग्रहीत MyShip का संदर्भ कहां है?" या "स्मृति में संग्रहीत myShip द्वारा ऑब्जेक्ट कहां इंगित किया गया है?" पूर्व के लिए वैचारिक उत्तर ढेर है, और उत्तरार्द्ध के लिए वैचारिक उत्तर हेप है, ऑप्टिमाइज़ेशन और पागल कार्यान्वयन को छोड़कर, और जवाब दोनों तरीकों का जवाब दे रहे हैं। –

उत्तर

23

myShipShip ऑब्जेक्ट का संदर्भ है, myShip विधि कॉल स्टैक पर है, जिसे "स्टैक" कहा जाता है। जब किसी विधि को स्मृति के ब्लॉक कहा जाता है तो उसे शीर्ष पर धक्का दिया जाता है, उस मेमोरी ब्लॉक में सभी प्राइमेटिव्स (int, float, boolean आदि) के लिए स्थान होता है और विधि के संदर्भ संदर्भ होते हैं, जिसमें विधि पैरामीटर शामिल होते हैं। ढेर वह जगह है जहां वास्तविक वस्तुओं की स्मृति आवंटित की जाती है।

तो myShip स्टैक पर है और Ship ऑब्जेक्ट ढेर पर है।

नोट प्रत्येक थ्रेड का अपना ढेर है लेकिन ढेर साझा करें।

13

जावा वास्तव में चीजों को थोड़ा अलग करता है। संदर्भ मूल रूप से ढेर पर है। वस्तु के लिए स्मृति को ढेर के लिए क्या गुजरता है आवंटित किया जाता है। हालांकि, आवंटित स्मृति का कार्यान्वयन सी/सी ++ मॉडल में ढेर को लागू करने के तरीके की तरह नहीं है।

जब आप इस तरह की एक नई वस्तु बनाते हैं, तो यह प्रभावी रूप से नाम को उस दायरे के संदर्भों की तालिका में डाल देता है। यह सी ++ में किसी ऑब्जेक्ट के पॉइंटर की तरह है। जब यह गुंजाइश से बाहर हो जाता है, तो वह संदर्भ गुम हो जाता है; आवंटित स्मृति अब संदर्भित नहीं है, और कचरा इकट्ठा किया जा सकता है।

+0

अगर यह सिर्फ 'जहाज जहाज' था, तो इसका मतलब है कि जहाज संदर्भ ढेर पर है, लेकिन कोई ऑब्जेक्ट नहीं बनाया गया है। लेकिन क्या इसका मतलब यह है कि इस समय 'जहाज' वर्ग लोड हो गया है? – Joeblackdev

+0

वास्तव में? मैंने सोचा कि ऐसा करने से नल के साथ शुरू किया गया एक शिप संदर्भ बनाता है। क्या कोई अंतर है? – Joeblackdev

+3

@ चार्लीमार्टिन: आप गलत हैं, Ship ship; एक जहाज नहीं बनाते! चर सिर्फ शून्य के लिए शुरू किया गया है। – tibo

6

वर्तमान में, सभी जावा ऑब्जेक्ट्स ढेर पर आवंटित किए जाते हैं। बात है कि जावा 7 भागने का विश्लेषण कर सकता है और ढेर पर आवंटित करने में सक्षम हो सकता है, लेकिन मुझे नहीं पता कि प्रस्ताव अभी तक अंतिम रूप दिया गया है या नहीं। Here's the RFE

संपादित करें: जाहिर है, यह already in early builds of JDK 7 है। (लेख में कहा गया है कि यह जेडीके 6u14 में भी होगा, लेकिन मुझे पुष्टि नहीं मिल सकती है।)

+2

एस्केप विश्लेषण कोड के अर्थशास्त्र को प्रभावित नहीं करता है, हालांकि, किसी को भी अपने अस्तित्व पर भरोसा करने या ग्रहण करने की आवश्यकता नहीं है। – bdonlan

+2

@bdonlan: सही है, हालांकि बच निकलने का विश्लेषण (जावा एसई 6u23, बीटीडब्ल्यू के बाद से लागू) आज के जावा में योगदान देता है जो 15 साल पहले लंगड़ा बतख नहीं था। –

3

नोटिसियल, ऑब्जेक्ट "ढेर" पर चला जाता है। फिर, क्योंकि यह एक विधि-स्थानीय संदर्भ है, वास्तविक संदर्भ ढेर पर होगा। "स्टैक" द्वारा, हमारा मतलब है कि सूर्य के वीएम के मामले में देशी थ्रेड स्टैक (यानी वही स्टैक जो सी में स्थानीय चर आवंटित किया जाएगा), लेकिन मुझे नहीं लगता कि यह वास्तव में एक आवश्यकता है (JVM बस "स्टैक फ्रेम" की कुछ अमूर्त धारणा है कि यह प्रत्येक विधि कॉल पर आवंटित करती है, चाहे वह मूल ढेर से हो या नहीं)।

लेकिन ... आधुनिक वीएम पर (स्वीकार्य रूप से सरल एम्बेडेड/एमपीबीआईएल वीएम के संभावित अपवाद के साथ), वास्तव में "ढेर" जैसी कोई चीज़ नहीं है। अभ्यास में, विभिन्न ढेर क्षेत्र हैं। इनमें से सबसे सरल आमतौर पर लगभग "मिनी स्टैक" की तरह होता है, जो ऑब्जेक्ट्स को आवंटित करने के लिए त्वरित होता है जो लंबे समय तक लटका नहीं होगा और संभवतः लगभग एक बार आवंटित किया जा सकता है।

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

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