हीप मेमोरी (Heap Memory)
- हीप मेमोरी एक रनटाइम डेटा क्षेत्र है जिससे सभी Java क्लास इंस्टेंसेस और ऐरे के लिए मेमोरी आवंटित की जाती है।
- हीप JVM स्टार्टअप पर बनाया जाता है और एप्लिकेशन चलने के दौरान इसका आकार बढ़ या घट सकता है।
- हीप का आकार
-XmsVM ऑप्शन का उपयोग करके निर्दिष्ट किया जा सकता है। हीप फिक्स्ड साइज या वेरिएबल साइज का हो सकता है, यह गार्बेज कलेक्शन स्ट्रेटेजी पर निर्भर करता है। अधिकतम हीप साइज-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 का उपयोग करते हैं।