Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java में हीप मेमोरी और स्ट्रिंग कॉन्स्टेंट पूल में क्या अंतर है?


हीप मेमोरी (Heap Memory)

  • हीप मेमोरी एक रनटाइम डेटा क्षेत्र है जिससे सभी Java क्लास इंस्टेंसेस और ऐरे के लिए मेमोरी आवंटित की जाती है।
  • हीप JVM स्टार्टअप पर बनाया जाता है और एप्लिकेशन चलने के दौरान इसका आकार बढ़ या घट सकता है।
  • हीप का आकार -Xms VM ऑप्शन का उपयोग करके निर्दिष्ट किया जा सकता है। हीप फिक्स्ड साइज या वेरिएबल साइज का हो सकता है, यह गार्बेज कलेक्शन स्ट्रेटेजी पर निर्भर करता है। अधिकतम हीप साइज -Xmx ऑप्शन से सेट की जा सकती है।
  • डिफ़ॉल्ट रूप से, अधिकतम हीप साइज 64 MB पर सेट होती है (आधुनिक JVM में यह सिस्टम मेमोरी के आधार पर भिन्न हो सकती है)।
  • हीप को जनरेशन्स में बांटा जाता है: यंग जनरेशन (Eden, Survivor spaces) और ओल्ड जनरेशन।

स्ट्रिंग कॉन्स्टेंट पूल (String Constant Pool - SCP)

  • स्ट्रिंग ऑब्जेक्ट्स के पुन: उपयोग (reuse) के लिए एक विशेष मेमोरी स्थान का उपयोग करता है जिसे स्ट्रिंग कॉन्स्टेंट पूल (SCP) कहा जाता है।
  • new कीवर्ड के बिना बनाए गए स्ट्रिंग ऑब्जेक्ट्स हीप के SCP भाग में स्टोर होते हैं।
  • स्ट्रिंग कॉन्स्टेंट पूल की एक महत्वपूर्ण विशेषता यह है कि यदि पूल में पहले से ही वही स्ट्रिंग कॉन्स्टेंट मौजूद है, तो यह उसी स्ट्रिंग ऑब्जेक्ट को दोबारा नहीं बनाता (इंटर्निंग)।
  • Java 7 से SCP को पर्मजेन (PermGen) से मुख्य हीप में ले जाया गया।

मुख्य अंतर

विशेषताहीप मेमोरीस्ट्रिंग कॉन्स्टेंट पूल (SCP)
उद्देश्यसभी ऑब्जेक्ट्स और ऐरे के लिए सामान्य आवंटनकेवल स्ट्रिंग लिटरल्स और इंटर्न्ड स्ट्रिंग्स के लिए
ऑब्जेक्ट निर्माणnew कीवर्ड से हमेशा नया ऑब्जेक्ट बनता हैलिटरल्स मौजूदा ऑब्जेक्ट को पुन: उपयोग करते हैं
डुप्लीकेशनसमान सामग्री के कई ऑब्जेक्ट्स संभवसमान सामग्री = एक ही ऑब्जेक्ट (इंटर्निंग)
गार्बेज कलेक्शनसामान्य GC नियमइंटर्न्ड स्ट्रिंग्स GC के अधीन (Java 7+)
आकार नियंत्रण-Xms, -Xmxअप्रत्यक्ष (हीप का हिस्सा)

उदाहरण

public class HeapVsSCP {
    public static void main(String[] args) {
        // SCP में - समान लिटरल = समान ऑब्जेक्ट
        String s1 = "Hello";
        String s2 = "Hello";
        System.out.println("s1 == s2: " + (s1 == s2)); // true

        // हीप में - new से हमेशा नया ऑब्जेक्ट
        String s3 = new String("Hello");
        String s4 = new String("Hello");
        System.out.println("s3 == s4: " + (s3 == s4)); // false
        System.out.println("s3.equals(s4): " + s3.equals(s4)); // true

        // intern() मेथड से SCP में डाल सकते हैं
        String s5 = new String("Hello").intern();
        System.out.println("s1 == s5: " + (s1 == s5)); // true
    }
}

आउटपुट

s1 == s2: true
s3 == s4: false
s3.equals(s4): true
s1 == s5: true

महत्वपूर्ण बिंदु

  • == रेफरेंस समानता जांचता है (समान ऑब्जेक्ट?)।
  • .equals() सामग्री समानता जांचता है (समान मान?)।
  • String.intern() मेथड स्ट्रिंग को SCP में डालता है (या मौजूदा रेफरेंस लौटाता है)।
  • अत्यधिक intern() उपयोग SCP को भर सकता है और मेमोरी समस्या पैदा कर सकता है।

निष्कर्ष: हीप सामान्य ऑब्जेक्ट आवंटन के लिए है, जबकि SCP स्ट्रिंग लिटरल्स के लिए एक अनुकूलित भंडारण है जो डुप्लीकेशन से बचाकर मेमोरी बचाता है। new String() हमेशा हीप में नया ऑब्जेक्ट बनाता है, जबकि लिटरल्स SCP का उपयोग करते हैं।

  1. Java में JTextField और JTextArea में क्या अंतर है? Java में JTextField और JTextArea में क्या अंतर है?

    Java में JTextField और JTextArea के बीच मुख्य अंतर यह है कि एक JTextField GUI एप्लिकेशन में टेक्स्ट की सिंगल लाइन एंटर करने की अनुमति देता है जबकि JTextArea GUI एप्लिकेशन में टेक्स्ट की मल्टीपल लाइन्स एंटर करने की अनुमति देता है। JTextField एक JTextField सबसे महत्वपूर्ण कंपोनेंट्स में से एक है जो

  1. Java में JFrame और JDialog में क्या अंतर है? Java में JFrame और JDialog में क्या अंतर है?

    JFrame फ्रेम में जोड़े गए कंपोनेंट्स को इसकी सामग्री कहा जाता है, इन्हें contentPane द्वारा प्रबंधित किया जाता है। JFrame में कंपोनेंट जोड़ने के लिए, हमें इसके contentPane का उपयोग करना चाहिए। एक JFrame में टाइटल, बॉर्डर, (वैकल्पिक) मेनू बार और यूज़र-स्पेसिफाइड कंपोनेंट्स के साथ एक विंडो होती है। ए

  1. Java में GridLayout और GridBagLayout में क्या अंतर है? Java में GridLayout और GridBagLayout में क्या अंतर है?

    एक GridLayout सभी कंपोनेंट्स को एक आयताकार ग्रिड में रखता है और इसे समान आकार के आयतों में विभाजित करता है और प्रत्येक कंपोनेंट को एक आयत के अंदर रखा जाता है जबकि GridBagLayout एक लचीला लेआउट मैनेजर है जो कंपोनेंट्स को वर्टिकली और हॉरिजॉन्टली संरेखित करता है बिना यह आवश्यकता के कि कंपोनेंट्स समान आक