जावा में, गार्बेज कलेक्शन (डिस्ट्रक्टर का काम) स्वचालित रूप से गार्बेज कलेक्शन का उपयोग करके किया जाता है। लेकिन क्या होगा अगर कोड में ऐसे ऑब्जेक्ट्स हैं जिनके संदर्भ हैं? उन्हें डी-एलोकेट नहीं किया जा सकता, यानी उनकी मेमोरी क्लियर नहीं की जा सकती। यदि ऐसी स्थिति बार-बार होती है, और बनाए गए या संदर्भित ऑब्जेक्ट्स का बिल्कुल भी उपयोग नहीं किया जाता है, तो वे बेकार हो जाते हैं। इसे ही मेमोरी लीक के रूप में जाना जाता है।
यदि मेमोरी लिमिट पार हो जाती है, तो प्रोग्राम एक त्रुटि फेंककर समाप्त हो जाता है, यानी OutOfMemoryError। यही कारण है कि हमेशा ऑब्जेक्ट के सभी संदर्भों को हटाने का सुझाव दिया जाता है ताकि जावा गार्बेज कलेक्टर स्वचालित रूप से इसे नष्ट कर सके।
नीचे एक उदाहरण दिया गया है जो दर्शाता है कि जब बहुत अधिक मेमोरी का उपयोग करने का प्रयास किया जाता है तो कंपाइलर कैसे स्पेस से बाहर हो जाता है:
उदाहरण
import java.util.Vector;
public class Demo{
public static void main(String[] args){
Vector my_v1 = new Vector(314567);
Vector my_v2 = new Vector(784324678);
System.out.println("यह प्रिंट होने वाली अंतिम लाइन है");
}
}
आउटपुट
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.base/java.util.Vector.<init>(Vector.java:142) at java.base/java.util.Vector.<init>(Vector.java:155) at Demo.main(Demo.java:7)
Demo नामक एक क्लास में मुख्य फंक्शन होता है जहां दो वेक्टर ऑब्जेक्ट्स को बहुत बड़े स्पेस असाइन करके बनाया गया है। अंतिम प्रिंट लाइन यह जांचने के लिए लिखी गई है कि क्या कंपाइलर उस लाइन तक पहुंचता है। वास्तव में, यह नहीं पहुंचता, क्योंकि इन वेक्टर्स द्वारा घेरा गया स्पेस बहुत बड़ा है और इतनी मेमोरी आवंटित नहीं की जा सकती, जिसके परिणामस्वरूप एक त्रुटि होती है।