जावा में मेमोरी और गार्बेज कलेक्टर: हुड के नीचे वास्तव में क्या होता है

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जावा मेमोरी का प्रबंधन कैसे करता है: सिर्फ 'गार्बेज कलेक्शन' नहीं

\n\n

C++ या Python से Java पर आने वाले कई डेवलपर पहले खुश होते हैं: 'वाह, मेमोरी लीक के बारे में सोचने की ज़रूरत नहीं!'। और फिर सबसे अनुपयुक्त समय पर OutOfMemoryError मिलता है और उन्हें एहसास होता है — जावा में मेमोरी प्रबंधन के लिए गहरी समझ की आवश्यकता होती है। आज हम JVM के हुड के नीचे झाँकेंगे और समझेंगे कि वास्तव में जावा में मेमोरी और गार्बेज कलेक्टर कैसे काम करते हैं।

\n\n

यह लेख उन शुरुआती लोगों के लिए उपयोगी होगा जो Java memory model को समझना चाहते हैं, साथ ही अनुभवी डेवलपर्स के लिए जो garbage collection Java के अनुकूलन के तरीके खोज रहे हैं। चलिए शुरू करते हैं!

\n\n
\n\n

जावा में मेमोरी कैसे व्यवस्थित होती है: Heap, Stack और Metaspace

\n\n

जावा गार्बेज कलेक्टर के बारे में बात करने से पहले, यह समझना ज़रूरी है कि आपकी वस्तुएँ (objects) कहाँ 'रहती' हैं। JVM मेमोरी को कई प्रमुख क्षेत्रों में विभाजित करता है:

\n\n
    \n
  • Heap (कूचा) — यहाँ सभी बनाई गई वस्तुएँ संग्रहीत होती हैं। यह garbage collection Java का मुख्य कार्यक्षेत्र है।
  • \n
  • Stack (स्टैक) — प्रिमिटिव प्रकार और heap में वस्तुओं के संदर्भ (references) संग्रहीत करता है। प्रत्येक थ्रेड का अपना स्टैक होता है।
  • \n
  • Metaspace — Java 8 में PermGen की जगह लेता है, क्लास के मेटाडेटा को संग्रहीत करता है।
  • \n
  • Code Cache — JIT कंपाइलर द्वारा संकलित कोड।
  • \n
\n\n

यहाँ एक सरल उदाहरण है जो दिखाता है कि डेटा कहाँ जाता है:

\n\n
public class MemoryDemo {\n    public static void main(String[] args) {\n        int number = 42;                    // प्रिमिटिव — स्टैक में\n        String text = "Hello";              // स्टैक में संदर्भ, heap में वस्तु\n        List<String> list = new ArrayList<>(); // स्टैक में संदर्भ, heap में सूची\n        list.add("Java");                   // स्ट्रिंग "Java" — heap में भी\n    }\n}\n
\n\n

मुख्य बिंदु: new के माध्यम से बनाई गई सभी वस्तुएँ Java heap में जाती हैं। इसी क्षेत्र पर जावा में गार्बेज कलेक्टर 'नज़र' रखता है।

\n\n
\n\n

गार्बेज कलेक्टर दुश्मन नहीं, बल्कि दोस्त क्यों है (यदि आप इसके तर्क को समझते हैं)

\n\n

कई डेवलपर 'Stop-The-World' पॉज़ के कारण Java GC से डरते हैं। लेकिन आइए सच्चाई का सामना करें: स्वचालित जावा मेमोरी प्रबंधन के बिना, हमें मैन्युअल रूप से free() लिखना होता और segfault पकड़ने होते। जावा गार्बेज कलेक्टर कोई बुरा दानव नहीं है, बल्कि एक जटिल, बुद्धिमान तंत्र है।

\n\n

garbage collection Java के काम करने के मूल सिद्धांत:

\n\n
    \n
  • एक वस्तु को 'कचरा' माना जाता है यदि उस पर स्टैक या स्थैतिक फ़ील्ड से कोई सक्रिय संदर्भ नहीं है।
  • \n
  • GC उस वस्तु को हटा नहीं सकता जिस पर अभी भी कोई संदर्भ है (भले ही आप इसके बारे में भूल गए हों)।
  • \n
  • विभिन्न GC एल्गोरिदम के अलग-अलग लक्ष्य होते हैं: न्यूनतम पॉज़, अधिकतम थ्रूपुट या मेमोरी बचत।
  • \n
\n\n

यहाँ मेमोरी लीक का एक क्लासिक उदाहरण है, जब किसी वस्तु को संग्रह से हटाना 'भूल' जाते हैं:

\n\n
public class LeakExample {\n    private static List<byte[]> cache = new ArrayList<>();\n\n    public static void addToCache() {\n        byte[] data = new byte[1024 * 1024]; // 1 MB\n        cache.add(data); // संदर्भ बना रहता है — GC इसे नहीं छुएगा\n    }\n\n    public static void main(String[] args) {\n        for (int i = 0; i < 1000; i++) {\n            addToCache();\n        }\n        // यहाँ OutOfMemoryError होगा, हालाँकि वस्तुएँ अब आवश्यक नहीं हैं\n    }\n}\n
\n\n

निष्कर्ष: जावा में मेमोरी तब तक मुक्त नहीं होगी जब तक आप संदर्भ रखते हैं। इसे समझना कुशल कोड लिखने की दिशा में पहला कदम है।

\n\n
\n\n

जावा में गार्बेज कलेक्टर के प्रकार: Serial से ZGC तक

\n\n

आधुनिक Java garbage collection Java के कई कार्यान्वयन प्रदान करता है। चुनाव आपके कार्यों पर निर्भर करता है:

\n\n

1. Serial GC — छोटे अनुप्रयोगों के लिए

\n

एकल-थ्रेडेड कलेक्टर जो पूरे एप्लिकेशन को 'फ़्रीज़' कर देता है। इसका उपयोग किया जाता है

ब्लॉग

पुस्तक अनुशंसाएँ