2012-03-01 9 views
10

ठीक है, इसलिए मैं जावा में एक साल से थोड़ी देर के लिए विकास कर रहा हूं और भाषा में गहराई से गोता लगाने का प्रयास कर रहा हूं और इसका सर्वोत्तम प्रयास कार्य करती है।जावा स्टेटिक्स प्राइमेटिव्स, ऑब्जेक्ट्स, मेथड्स एंड द हीप (मेमोरी मैनेजमेंट एंड बेस्ट प्रैक्टिस)

  • जावा "प्रकार से गुजरता है" - कि पुरातन प्रति (संदर्भ ढेर पर उनके वस्तु को इंगित) द्वारा कॉपी और वस्तु संदर्भ पास से गुजरती है:

    तो यहाँ मैं क्या जानते हैं।

  • प्राथमिक उदाहरण चर और संदर्भ ढेर और स्थानीय प्राइमेटिव्स में संदर्भ में रहते हैं और संदर्भ स्टैक पर रहते हैं (उनके संबंधित ढेर फ्रेम में)।

  • पर्म जनरल मेमोरी स्पेस वह जगह है जहां कक्षा मेटा डेटा संग्रहीत किया जाता है (प्रतिबिंब के लिए उपयोग किया जाता है)।

  • हीप में एक ईडन स्पेस है जहां नई वस्तुएं होती हैं, एक युवा स्थान जहां जीसी से बचने वाली वस्तुओं को रखा जाता है और एक टेनेटेड स्पेस जहां लंबे समय तक जीवित वस्तुओं को रखा जाता है।

तो यहाँ मैं को समझने के लिए चाहते हैं क्या है:

  • कहाँ स्थिर और स्थिर अंतिम पुरातन और संदर्भ रहते हैं कि JVM एक उदाहरण उपयोग करने में सक्षम है?

  • ढेर में संग्रहीत स्थिर और स्थिर अंतिम वस्तुएं हैं (मुझे लगता है कि वे कार्यकाल में स्थानांतरित हो गए हैं)?

  • किसी एप्लिकेशन में स्थिर अंतिम संदर्भों की संख्या के संदर्भ में सबसे अच्छा अभ्यास क्या माना जाता है?

  • अधिक स्थिर अंतिम संदर्भ बनाने से JVM में हीप स्पेस की मात्रा कम हो जाएगी?

मैं इस बारे में कई अलग अलग स्पष्टीकरण पढ़ा है (सभी मतभेद) और यदि जावा भाषा में एक अनुभवी दिग्गज एक अच्छा विवरण प्रदान कर सकता है अच्छा लगेगा। अग्रिम में धन्यवाद!

+1

इस तो सवाल के लिए लिंक http://stackoverflow.com/questions/3849634/ स्थिर कक्षाओं के बारे में कुछ जानकारी है स्थिर-आवंटन-इन-जावा-हीप-स्टैक-एंड-स्थायी पीढ़ी – fasseg

उत्तर

5

युवा अंतरिक्ष में ईडन स्पेस और उत्तरजीवी रिक्त स्थान शामिल हैं।

स्थिर और स्थैतिक अंतिम प्राइमेटिव और संदर्भ कहां रहते हैं कि JVM एक उदाहरण का उपयोग करने में सक्षम है?

इसकी परिभाषा नहीं है, लेकिन सूर्य/ओरेकल जेवीएम में, स्थिर फ़ील्ड कक्षा क्षेत्रों के लिए एक विशेष वस्तु में रहते हैं। आपके पास प्रति वर्ग लोडर का एक उदाहरण है इसलिए स्थिर फ़ील्ड में कई उदाहरण हो सकते हैं।

ढेर में संग्रहीत स्थिर और स्थैतिक अंतिम वस्तुएं हैं (मुझे लगता है कि वे कार्यकाल में स्थानांतरित हो गए हैं)?

सूर्य/ओरेकल जावा 7 में वे हैं। वे पर्म जनरल या कहीं और हो सकते हैं।

किसी एप्लिकेशन में स्थिर अंतिम संदर्भों की संख्या के संदर्भ में सबसे अच्छा अभ्यास क्या माना जाता है?

उन्हें न्यूनतम रखें।

अधिक स्थिर अंतिम संदर्भ बनाएगा जेवीएम में हीप स्पेस की मात्रा कम करेगा?

यदि आप अंतिम क्षेत्र को स्थिर अंतिम क्षेत्र में बदल सकते हैं, तो यह कुछ जगह बचा सकता है (यदि आपके पास कई उदाहरण हैं) हालांकि, प्रदर्शन की तुलना में स्पष्टता आमतौर पर अधिक महत्वपूर्ण होती है। (और मैं इसे स्पष्टता के लिए करूँगा)

बीटीडब्ल्यू: मैं जावा में 13 वर्षों से विकास कर रहा हूं।

तो वहाँ स्थिर क्षेत्रों के कई उदाहरण हो सकता है - JVM प्रत्येक उदाहरण

वे स्वतंत्र हैं, नहीं बदलेगा। प्रत्येक classloader एक वर्ग का अपना संस्करण लोड कर सकते हैं (कोड वैसा ही होना आवश्यक नहीं है) और प्रत्येक की अपनी स्थिर क्षेत्रों हो जाता है

अगर एक स्थिर (वे एक ही या तो होना करने के लिए नहीं है) फ़ील्ड बदल दिया गया है (यानी स्थैतिक int instanceCount जहां प्रत्येक ऑब्जेक्ट निर्माण पर exampleCount ++ निष्पादित किया जाता है)?

सं

इसके अलावा, वस्तुओं पेर्म जनरल के लिए ले जाया जा सकता है?

नहीं। कुछ डेटा जो एक स्थान में परिभाषित नहीं है, कार्यान्वयन और संस्करण के आधार पर कहीं भी हो सकता है।

क्या पर्म जनरल को ढेर का हिस्सा माना जाता है?

यह पुराने जीन = कार्यकाल + परम जीन का हिस्सा है।

युवा पीढ़ी = ईडन + उत्तरजीवी अंतरिक्ष * 2

अधिकतम ढेर आकार युवा पीढ़ी & पर्याप्त कुल सीमित करता है। पर्म जेन और सीधी मेमोरी की अपनी सीमाएं हैं। मेमोरी मैप की गई फाइलें इन सीमाओं में से किसी एक का पालन करती हैं।

यह डिफ़ॉल्ट समांतर संग्राहक और समवर्ती चिह्न स्वीप के लिए सच है।

जी 1 संग्राहक रिक्त स्थान को उसी तरह विभाजित नहीं करता है।


अधिक जानकारी के

http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

Java heap terminology: young, old and permanent generations?

http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html

+0

आपकी त्वरित प्रतिक्रिया के लिए धन्यवाद युवा हीप अंतरिक्ष पर स्पष्टीकरण। तो स्थैतिक फ़ील्ड के कई उदाहरण हो सकते हैं - यदि कोई स्थिर फ़ील्ड बदल जाता है तो जेवीएम प्रत्येक उदाहरण को बदलता है (यानी स्थैतिक int instanceCount जहां प्रत्येक ऑब्जेक्ट निर्माण पर exampleCount ++ निष्पादित किया जाता है)? इसके अलावा, ऑब्जेक्ट को पर्म जनरल में स्थानांतरित किया जा सकता है? क्या पर्म जनरल को ढेर का हिस्सा माना जाता है? बहुत सारे प्रश्नों के लिए खेद है, यह मेरे लिए बहुत उपयोगी है और मैं आपको बहुत धन्यवाद देता हूं। यदि आपको कोई फर्क नहीं पड़ता है तो बस इन समाधानों के साथ अपना उत्तर अपडेट करें ताकि अन्य लोगों को आसानी मिल सके। एक बार फिर धन्यवाद। – jjNford

+0

मैं इस पर और अधिक पढ़ने में दिलचस्पी लेता हूं - क्या आप कुछ स्रोत प्रदान कर सकते हैं? (या ऐसी चीजें हैं जो JVM-Spec द्वारा कवर की गई हैं?) – quaylar

+0

@quaylar वे आमतौर पर कार्यान्वयन विवरण होते हैं जो spec द्वारा कवर नहीं होते हैं। –

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