← Back to Advanced Java Course | Chapter 11: Advanced & Security | Lesson 4 of 19

Java में Memory Management

Memory management यह है कि Java किसी computer की memory का उपयोग आपके program का data रखने के लिए कैसे करता है, जैसे desks और shelves को व्यवस्थित करना। इसे समझने से आपको space खत्म होने से बचने में मदद मिलती है।

Stack vs Heap Memory

Java local variables और method call frames को हर thread के अपने Stack पर allocate करता है, जो तेज़ है और किसी method के return होने पर अपने आप साफ़ हो जाता है, जबकि असली object instances shared Heap में रहते हैं, जिसे इसके बजाय garbage collector manage करता है।

उदाहरण: Stack vs Heap Memory

java
public class Main {
	static class Point { int x; } // instances live on the Heap
	public static void main(String[] args) {
		int localVar = 5; // lives on the Stack, cleaned up when main() returns
		Point p = new Point(); // the reference is on the Stack, the object itself is on the Heap
		System.out.println(localVar + " " + p);
	}
}

Memory Leak Identification

Java में memory leaks तब होते हैं जब code उन objects के references रखता है जिनकी उसे असल में अब ज़रूरत नहीं -- बढ़ती static list, या बिना बंद हुआ listener registration -- जो garbage collector को उन objects को वापस पाने से रोकता है भले ही program उनका फिर कभी उपयोग न करे।

उदाहरण: Memory Leak Identification

java
import java.util.*;
public class Main {
	static List<Object> cache = new ArrayList<>(); // static list -- keeps growing, never cleared
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) cache.add(new Object());
		System.out.println("Cache size: " + cache.size() + " -- these can never be garbage collected");
	}
}

OutOfMemoryError (OOM)

JVM एक OutOfMemoryError फेंकता है जब heap allocation requests इसके लिए असल में उपलब्ध memory से ज़्यादा हों, जो आमतौर पर या तो एक असली memory leak या application के असली workload के लिए बहुत छोटी configured heap size limit (-Xmx) को संकेत करता है।

उदाहरण: OutOfMemoryError (OOM)

java
public class Main {
	public static void main(String[] args) {
		try {
			int[] huge = new int[Integer.MAX_VALUE]; // exceeds available heap
		} catch (OutOfMemoryError e) {
			System.out.println("Caught OutOfMemoryError: heap exceeded");
		}
	}
}

Metaspace Configuration

Class metadata -- loaded classes की compiled structure खुद, object instances नहीं -- Metaspace में रहता है, एक dynamically-sized memory region जो regular Java heap के बजाय native (off-heap) system memory से लेता है।

उदाहरण: Metaspace Configuration

java
public class Main {
	public static void main(String[] args) {
		// Run with: java -XX:MaxMetaspaceSize=128m Main
		System.out.println("Class metadata lives in Metaspace, drawn from native memory, not the heap");
	}
}

Finalization and Cleaner API

Cleaner API किसी object के lifecycle से बंधे off-heap resources (जैसे native memory या file handles) को release करने का एक ज़्यादा सुरक्षित, predictable तरीका प्रदान करता है, उस पुराने, अविश्वसनीय Object.finalize() mechanism को replace करते हुए जिसकी JVM ने कभी जल्दी चलने की गारंटी नहीं दी, अगर बिल्कुल भी चले।

उदाहरण: Finalization and Cleaner API

java
// Import java.lang.ref.Cleaner so it can be used by its short name
import java.lang.ref.Cleaner;
// Define the class Main
public class Main {
	static final Cleaner cleaner = Cleaner.create();
	// Program entry point: the JVM starts running here
	public static void main(String[] args) {
		// Create a new Object object and store it in resource
		Object resource = new Object();
		cleaner.register(resource, () -> System.out.println("Cleaned up off-heap resource"));
		resource = null;
		System.gc();
	}
}
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. StackOverflowError (stack पर बहुत गहरी recursion) को OutOfMemoryError (heap या metaspace भर गई है) के साथ confuse करना।
  2. किसी static collection में objects जोड़ना और उन्हें कभी न हटाना, जो एक memory leak है क्योंकि वे reachable बने रहते हैं।
  3. resources release करने के लिए finalize() पर निर्भर रहना, जबकि इसका समय अप्रत्याशित है; try-with-resources या Cleaner API का उपयोग करें।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.