स्थैतिक तरीके और स्थैतिक चर जावा में कहाँ संग्रहीत हैं?


115

उदाहरण के लिए:

class A {
    static int i=0;
    static int j;

   static void method() {
       // static k=0; can't use static for local variables only final is permitted
       // static int L;
    }
}

ये चर जावा में, ढेर में या स्टैक मेमोरी में कहाँ संग्रहीत किए जाएंगे? वे कैसे संग्रहीत हैं?


2
ओरेकल की आधिकारिक वेबसाइट पर कचरा संग्रह को समझने के लिए बहुत उपयोगी लिंक: oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/…
अर्नव जोशी

जवाबों:


144

स्थैतिक विधियाँ (वास्तव में सभी विधियाँ) और साथ ही स्थिर चर भी इसमें संचित हैं PermGen ढेर खंड , क्योंकि वे प्रतिबिंब डेटा (वर्ग से संबंधित डेटा, उदाहरण से संबंधित नहीं) का हिस्सा हैं।

स्पष्टीकरण के लिए अपडेट करें :

ध्यान दें कि केवल चर और उनके तकनीकी मूल्य (प्राइमेटीज़ या संदर्भ) PermGen अंतरिक्ष में संग्रहीत हैं।

यदि आपका स्टैटिक वेरिएबल किसी ऑब्जेक्ट का संदर्भ है जो ऑब्जेक्ट हीप के सामान्य वर्गों (युवा / पुरानी पीढ़ी या उत्तरजीवी स्थान) में संग्रहीत है। वे वस्तुएं (जब तक कि वे आंतरिक वस्तुएं जैसे कक्षाएं आदि) नहीं हैं पर्मगेन स्थान में संग्रहीत होती ।

उदाहरण:

static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.


कचरा संग्रहण पर एक शब्द:

करो नहीं पर भरोसा करते हैंfinalize() क्योंकि इसे चलाने की गारंटी नहीं है। कचरा संग्रहण के लिए कब और क्या इकट्ठा करना है, यह तय करना जेवीएम के लिए पूरी तरह से है, भले ही कोई वस्तु कचरा संग्रहण के लिए योग्य हो।

बेशक आप एक स्थिर चर को शून्य करने के लिए सेट कर सकते हैं और इस प्रकार ढेर पर ऑब्जेक्ट के संदर्भ को हटा सकते हैं लेकिन इसका मतलब यह नहीं है कि कचरा संग्रहकर्ता इसे इकट्ठा करेगा (भले ही अधिक संदर्भ न हों)।

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

एक अंतिम नोट : कोड, रनटाइम डेटा आदि को कैसे संग्रहीत किया जाता है यह जेवीएम पर निर्भर करता है जिसका उपयोग किया जाता है, अर्थात हॉटस्पॉट इसे JRockit से अलग तरीके से कर सकता है और यह समान JVM के संस्करणों के बीच भिन्न हो सकता है। उपरोक्त जावा 5 और 6 के लिए हॉटस्पॉट पर आधारित है (जो मूल रूप से समान हैं) उत्तर देने के समय से मैं कहूंगा कि अधिकांश लोग उन जेवीएम का उपयोग करते थे। Java 8 के रूप में मेमोरी मॉडल में बड़े बदलाव के कारण, ऊपर दिए गए कथन Java 8 HotSpot के लिए सही नहीं हो सकते हैं - और मैंने Java 7 HotSpot के परिवर्तनों की जाँच नहीं की है, इसलिए मुझे लगता है कि उपरोक्त अभी भी उस संस्करण के लिए सही है, लेकिन मुझे यहां यकीन नहीं है।


1
क्या आप स्थैतिक चर के बारे में निश्चित हैं? AFAIK PermGen केवल परिभाषाओं को संग्रहीत करता है वास्तविक मूल्य नहीं।
अमीर रामिनफर

2
@Amir मुझे पूरा यकीन है कि चर ही permgen अंतरिक्ष में संग्रहीत किया जाता है, किसी भी संदर्भित ऑब्जेक्ट को सबसे अधिक संभावना ढेर पर आवंटित किया जाएगा। यह कुछ जानकारी जोड़ सकता है: stackoverflow.com/questions/3800444/…
थॉमस

1
आह हाँ चर परिभाषा permgen में संग्रहीत है। लेकिन मूल्य ढेर में होगा। आपके उत्तर ने सुझाव दिया कि मान भी PermGen में संग्रहीत है।
अमीर रफ़्फ़र

1
@ मैथ्यू आप मेरे जवाब को कैसे समझते हैं? A ने कहा कि चर वेगमेन खंड (प्राइमेटिव / रेफरेंस) में संग्रहित किए जाते हैं, न कि जिन वस्तुओं को वे संदर्भित करते हैं। यह इस बात पर निर्भर करता है कि आप चर मान कैसे देखते हैं ।
थॉमस

1
@ नहीं, ढेर के सभी हिस्से डिफ़ॉल्ट रूप से और कभी-कभी कक्षाओं द्वारा एकत्र किए गए कचरा हैं और इस प्रकार स्थिर चर एकत्र नहीं किए जा सकते क्योंकि क्लास लोडर अभी भी उन पर एक संदर्भ है। इसके अतिरिक्त आपको कूड़ा उठाने वाले पर भरोसा नहीं करना चाहिए क्योंकि वह पूरी तरह से जेवीएम तक है (यह तय करना है कि कब दौड़ना है और क्या इकट्ठा करना है, आप केवल संकेत दे सकते हैं जैसे "मैं चाहूंगा कि अब आप जीसी चलाना चाहते हैं" :)) ।
थॉमस

25

वर्ग चर (स्टेटिक चर) Class objectउस वर्ग के साथ जुड़े भाग के रूप में संग्रहीत किए जाते हैं । यह क्लास ऑब्जेक्ट केवल JVM द्वारा बनाया जा सकता है और इसमें स्टोर किया जाता है permanent generation

इसके अलावा कुछ ने उत्तर दिया है कि यह गैर ढेर क्षेत्र में संग्रहीत किया जाता है जिसे Method Area.यहां तक कहा जाता है कि यह उत्तर गलत नहीं है। यह सिर्फ एक बहस का विषय है कि क्या परमिटेन एरिया ढेर का हिस्सा है या नहीं। स्पष्ट रूप से धारणाएं व्यक्ति से दूसरे व्यक्ति में भिन्न होती हैं। मेरी राय में हम JVM के तर्कों में अलग से ढेर जगह और पर्मगेन जगह प्रदान करते हैं। इसलिए उन्हें अलग तरह से व्यवहार करना एक अच्छी धारणा है।

इसे देखने का दूसरा तरीका

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

यहां छवि विवरण दर्ज करें


क्या विधि क्षेत्र मेमोरी के पर्मगेन खंड का उपसमूह नहीं है? आपने गैर-हीप मेमोरी के भाग के रूप में विधि क्षेत्र को क्यों दिखाया है, मुझे लगता है, वे (विधि (क्षेत्र) क्षेत्र के साथ PermGen) JVM के बड़े ढेर क्षेत्र का हिस्सा हैं?
केवेश कंवल

अंतिम पंक्ति पढ़ें -Also this non-heap is nothing but perm gen area.Actually Method area is part of perm gen.
अनिकेत ठाकुर

1
@ अचिंतचाकुर आपने गैर-हीप मेमोरी के हिस्से के रूप में विधि क्षेत्र दिखाया है, लेकिन ओरेकल डॉक्स के अनुसार, यहां, डॉक्स.कोरल . com / javase / specs / jvms / se7 / html / , यह उल्लेख किया गया है कि विधि क्षेत्र तार्किक रूप से हिस्सा है ढेर।
करण

21

जावा 8 से पहले:

स्थिर चर को पर्मगेन स्पेस (जिसे विधि क्षेत्र भी कहा जाता है) में संग्रहीत किया गया था।

PermGen Space को Method Area के नाम से भी जाना जाता है

PermGen Space 3 चीजों को Store करता था

  1. कक्षा स्तर का डेटा (मेटा-डेटा)
  2. सख़्त तार
  3. स्थिर चर

जावा 8 से

स्थिर चर हीप में संग्रहीत किए जाते हैं। जावा 8 के बाद से पेर्मगेन स्पेस को हटा दिया गया है और मेटास्पेस के रूप में नामित नए स्थान को पेश किया गया है जो पिछले पर्मेन स्पेस के विपरीत किसी भी अधिक हीप का हिस्सा नहीं है। मेटा-स्पेस देशी मेमोरी (ओएस द्वारा किसी विशेष एप्लिकेशन को उसके स्वयं के उपयोग के लिए प्रदान की गई मेमोरी) पर मौजूद है और अब यह केवल क्लास मेटा-डेटा स्टोर करता है।

नजरबंद स्ट्रिंग्स और स्टैटिक वैरिएबल को हीप में ले जाया जाता है।

आधिकारिक जानकारी के लिए देखें: JEP 122: स्थायी जनरल स्पेस को हटा दें


जब आप स्थिर चर> Java8 के लिए "हीप" कहते हैं, तो वास्तव में कहां: ओल्डगेन?
इवोक्स

15

यह एक सरल उत्तर और लंबे उत्तर वाले उत्तर वाला प्रश्न है।

सरल उत्तर ढेर है। कक्षाएं और कक्षाओं में लागू होने वाले सभी डेटा (उदाहरण के लिए डेटा नहीं) को ढेर के स्थायी पीढ़ी अनुभाग में संग्रहीत किया जाता है।

लंबा जवाब पहले से ही स्टैक ओवरफ्लो पर है:

वहाँ एक है स्मृति और JVM में कचरा संग्रहण की पूरी तरह से वर्णन के साथ ही एक जवाब यह है कि वार्ता अधिक संक्षेप में इसके बारे में।


3
ज़रूर! यदि आप उन्हें उपयोगी पाते हैं तो उन लोगों को उभारना न भूलें।
वासिली शारापोव

11

इसे वर्ग परिभाषा द्वारा संदर्भित ढेर में संग्रहीत किया जाता है। यदि आप इसके बारे में सोचते हैं, तो इसका स्टैक से कोई लेना-देना नहीं है क्योंकि इसमें कोई गुंजाइश नहीं है।


5

थॉमस के जवाब के अलावा, स्थिर चर को गैर ढेर क्षेत्र में संग्रहीत किया जाता है जिसे विधि क्षेत्र कहा जाता है।


4

चूंकि स्थिर चर वर्ग स्तर के चर हैं, वे ढेर मेमोरी के " स्थायी पीढ़ी " को संग्रहीत करेंगे । कृपया JVM के अधिक विवरण के लिए इसे देखें। यह उम्मीद करना मददगार होगा


3

स्थिर चर ढेर में जमा हो जाते हैं


7
स्टैटिक वेरिएबल को प्रेमजेन स्पेस में मेमोरी में स्टोर किया जाता है, इनके मान हीप में स्टोर होते हैं।
आकाश ५२ Ak Ak
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.