2012-11-01 6 views
5

मैं पूरी तरह से समझने की कोशिश कर रहा हूं कि जावा अपनी मेमोरी व्यवस्था के साथ कैसे काम करता है। इंटरनेट पर चर्चा बहुत उलझन में होती है, और कभी-कभी एक-दूसरे से विरोधाभास करती है, इसलिए मुझे कोई भी विश्वास नहीं मिला जिसे मैं भरोसा कर सकता हूं। यह चीज बहुत जटिल हो सकती है अगर यह स्थैतिक, स्थैतिक विधि, स्थानीय चर, धागा, अस्थिर और अन्य के साथ मिश्रित हो। तो मैं सोच रहा हूं कि क्या कोई तरीका है कि मैं खुद को कुछ जावा कोडिंग प्रयोग कर रहा हूं। एक वर्ग MemoryTrack कुछ इस तरह,जावा में, क्या एक चर, एक विधि या वर्ग हैप या स्टैक में बनाए गए वर्ग को ट्रैक करने का कोई तरीका है?

public myMethod(){ 
int i = 0; 
MemoryTrack.show(new myClass()); //print out "Heap at address 111" 
MemoryTrack.show(new myClass()); //print out "Heap at address 222" 
MemoryTrack.show(i); //print out "Stack at address 333" 
MemoryTrack.show("a static method"); //print out "stack at address 444" 
} 
+0

इसे उत्तर के रूप में क्यों पोस्ट नहीं करें? –

+1

किसी भी घटना में, जावा के बिंदु का हिस्सा यह है कि आपको ध्यान नहीं देना चाहिए कि ढेर पर क्या है और ढेर पर क्या है - वास्तव में, जेआईटी कभी-कभी यह पता लगा सकता है कि कुछ सामान्य रूप से उस स्टैक पर जा सकता है जो आमतौर पर ढेर। –

+0

@ ज़ोलटन: किया गया। - – ignis

उत्तर

7

स्मृति के उपयोग Section 2.5 of the Java Virtual Machine Specification में वर्णन किया गया है। स्टैक स्टोर ढेर फ्रेम (स्थानीय चर और आंशिक परिणाम युक्त)। ढेर वह जगह है जहां सभी वर्ग के उदाहरण और सरणी आती हैं। ढेर फ्रेम भी ढेर से आवंटित किया जा सकता है (और फिर ढेर पर धक्का दिया)। विधि क्षेत्र और रनटाइम निरंतर पूल मेमोरी भी हैं। विवरण में विवरण लिखा गया है।

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

3

नियम बहुत सरल है: ढेर में ऑब्जेक्ट्स हैं, स्टैक में स्थानीय चर और विधि पैरामीटर शामिल हैं। ऑब्जेक्ट फ़ील्ड ऑब्जेक्ट के अंदर, ढेर में हैं। स्थिर क्षेत्रों के बारे में पता नहीं है। तरीके और कन्स्ट्रक्टर ढेर में नहीं रखे जाते हैं, न ही ढेर में। थ्रेड और अस्थिर कोई फर्क नहीं पड़ता।

विधि कॉल ढेर पर हैं। प्रत्येक में इसके लिए एक स्थान आरक्षित है, स्टैक फ्रेम, जिसमें स्थानीय चर और पैरामीटर शामिल हैं।

-1

आपको लगता है कि जावा में सभी चर ढेर पर हैं। दरअसल यह कार्यान्वयन निर्भर है।

+2

दरअसल, यह [जावा वर्चुअल मशीन विशिष्टता] (http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5) में बहुत अच्छी तरह से निर्दिष्ट है। एकमात्र कार्यान्वयन निर्भर विशेषताएं ढेर की संरचना हैं, चाहे ढेर से ढेर फ्रेम आवंटित किए जाते हैं, और कुछ अन्य मुद्दों को ओपी के प्रश्न के परिधीय होते हैं। –

+0

मैंने सुना है कि उन्होंने जावा 7 या जावा 6 में या तो कुछ बदल दिया है ... – Dims

+1

उपर्युक्त लिंक एसई 7 के लिए है। [एसई 5 के लिए spec] (http://docs.oracle.com/javase/specs/jvms /se5.0/html/Overview.doc.html#1732) इस विषय के लिए बहुत अधिक भाषा है। –

1

दो बातें आप जानना चाहते हैं

  • अपनी नहीं के रूप में जटिल रूप में आपको लगता है।
  • इससे कोई फर्क नहीं पड़ता 99%।

चर ढेर पर हमेशा से रहे हैं।

ऑब्जेक्ट्स हमेशा ढेर पर होते हैं। (अपवाद हैं लेकिन मैं उनके बारे में चिंता नहीं करता)

तरीके और कक्षाएं हमेशा परम जीन में होती हैं।

हॉटस्पॉट/ओपनजेडीके जेवीएम में, स्थिर फ़ील्ड कक्षा के लिए सिंगलटन ऑब्जेक्ट में एकत्र किए जाते हैं। यदि आप एक ढेर डंप करते हैं तो आप उदाहरण देख सकते हैं। अन्य JVMs इसे अलग-अलग कर सकते हैं।

एक वर्ग MemoryTrack कुछ इस तरह होता है,

इस तरह की एक विधि कुछ भी तर्क हमेशा स्टैक पर हो सकता है और वस्तु के रूप में उपयोगी नहीं करेंगे यह हमेशा ढेर पर होगा को दर्शाता है। आप किसी ऑब्जेक्ट का मेमोरी लोकेशन मानक तरीके से नहीं प्राप्त कर सकते हैं और यदि यह किसी भी समय बदल सकता है तो यह उपयोगी होने की संभावना नहीं है।

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