πŸ—‘οΈ Java Garbage Collector

Complete Deep Revision Guide β€” Memory management ek baar samjho, hamesha yaad rahega!

πŸ”΅ Case 1: null Assign 🟒 Case 2: Method Scope 🟑 Case 3: Reassign πŸ”΄ finalize() Method

πŸ“– Garbage Collector Kya Hai?

❌ C/C++ β€” Manual
delete ptr; karna padta hai β†’ bhool gaye? β†’ MEMORY LEAK!
βœ… Java β€” Automatic GC
JVM automatically memory free karta hai β†’ tension nahi!
1
Mark: Kaunse objects referenced hain? Mark karo
2
Sweep: Unreferenced objects delete karo
3
Compact: Memory defragment karo (gaps fill karo)
⚑ Nondeterministic: System.gc() sirf request hai β€” JVM decide karta hai exactly kab chalega. Programmer control nahi kar sakta!
πŸ”΅

Case 1: null Assign Karo

Reference hatao β†’ Object orphan β†’ GC eligible!

Concept

β†’
Object obj = new Object() β†’ HEAP mein object bana, obj reference hold karta hai
β†’
obj = null β†’ reference hat gaya β†’ Object ORPHAN! β†’ GC eligible!
β†’
Jo objects abhi bhi kisi variable se referenced hain β€” unhe GC nahi karega
P1

GC_NullAssign1.java β€” Basic null assign + finalize() demo

Kya seekhenge: obj1 = null β†’ Object #1 ka koi reference nahi raha β†’ GC eligible. obj3 abhi bhi variable se referenced β†’ GC nahi karega. System.gc() request ke baad Objects #1 aur #2 destroy hue. finalize() β€” JVM object destroy karne se pehle is method ko call karta hai!
P2

GC_NullAssign2.java β€” Bulk null assign (Even/Odd selective GC)

Kya seekhenge: Array mein 10 objects banao, even index wale null karo β†’ sirf wo GC eligible. Odd index wale survive karte hain. destroyCount static variable se track karo kitne destroy hue. Bulk operations mein GC kaise kaam karta hai!
P3

GC_NullAssign3.java β€” Memory Tracking (Runtime.getRuntime())

Kya seekhenge: Runtime.getRuntime() se actual JVM memory dekh sakte hain! GC ke baad Used memory kam ho gayi β€” proof ki memory free hui! Before/After comparison se clearly dekho GC ka effect.
P4

GC_NullAssign4.java β€” Reference Chain (Tricky Case!)

Kya seekhenge: Tricky case! Chain a β†’ b β†’ c hai. b = null aur c = null karne ke baad bhi objects destroy nahi hue β€” kyunki a.next unhe point kar raha tha! Sirf tab destroy hue jab a = null kiya β€” poori chain unreachable ho gayi!
🟒

Case 2: Method Ke Andar Object Banana

Method khatam β†’ local variables destroy β†’ Objects GC eligible!

Concept

β†’
Method ke andar bana object β†’ method end pe local var destroy β†’ object ORPHAN!
β†’
Return kiya? Caller variable hold karta hai β†’ NOT eligible
β†’
Return nahi kiya? Method end pe eligible β†’ GC collect karega
P1

GC_MethodScope1.java β€” Method scope basic demo

Kya seekhenge: temporaryWork() ke andar bane objects, method khatam hote hi GC eligible! Second call pe naye objects bane (#3, #4) β€” previous (#1, #2) already collect ho chuke the. Har method call pe fresh objects!
P2

GC_MethodScope2.java β€” Return vs Discard (Key Difference!)

Kya seekhenge: Key difference! createAndReturn() β†’ object return hua β†’ kept variable hold kar raha β†’ NOT eligible. createAndDiscard() β†’ object return nahi hua β†’ method end pe eligible β†’ GC collected! Conditional return bhi demonstrate kiya.
P3

GC_MethodScope3.java β€” Nested Methods + Loop Objects

Kya seekhenge: outerMethod() ne innerMethod() call kiya β€” inner ka object pehle eligible hua. Loop mein objects: har iteration pe naya object banta hai, pichla eligible ho jaata hai. gcCount se track karo.
P4

GC_MethodScope4.java β€” Large Objects Memory Recovery

Kya seekhenge: Bade arrays (50,000+ ints) method scope mein banao. Method end pe eligible β†’ GC collect karta hai β†’ memory recover hoti hai! Before/After memory comparison se clearly visible. Real-world data processing pattern.
🟑

Case 3: Reference Reassign β€” Purana Orphan

Reference nayi jagah point kare β†’ purana object orphan β†’ GC eligible!

Concept

Before reassign:
a ──→ [First]
b ──→ [Second]
After: a = b
a ──┐
b ──┴──→ [Second]
[First] ← ORPHAN!
β†’
a = b β†’ a ab Second ko point karta hai β†’ "First" object ORPHAN β†’ GC eligible!
β†’
Ab a == b β†’ true! Dono same object ko point karte hain
P1

GC_Reassign1.java β€” Basic Reassign (ref1 = ref2)

Kya seekhenge: ref1 = ref2 β†’ ref1 ab v2 ko point karta hai β†’ v1 object ka koi reference nahi β†’ ORPHAN β†’ GC! Ab ref1 == ref2 true hai β€” dono same object ko point karte hain!
P2

GC_Reassign2.java β€” Repeated Upgrades (Version Chain)

Kya seekhenge: Ek single reference variable ko baar baar reassign karo β€” pichla object orphan hota jaata hai. Version 1.0 β†’ 2.0 β†’ 3.0 β†’ 4.0 β€” upgrade pattern mein GC! Real-world mein configuration reload, object replacement jaise scenarios.
P3

GC_Reassign3.java β€” All 3 Cases Together!

Kya seekhenge: Teeno cases ek program mein β€” null assign + method scope + reassign. Summary mein total created vs destroyed dekho. Interview mein yeh combo program puchha jaata hai!
πŸ”΄

Topic 4: finalize() Method

Object destroy hone se PEHLE JVM call karta hai β€” last chance cleanup!

Important Rules

βœ…
Object.class se inherit hota hai β€” har class mein available
βœ…
GC call karta hai β€” developer directly nahi
⚠️
Exactly kab call hoga? NONDETERMINISTIC!
⚠️
Exception aaye to GC ignore karta hai β€” object phir bhi destroy!
❌
Java 9 se @Deprecated β€” use try-with-resources instead! Critical cleanup ke liye mat use karo.
P1

Finalize1.java β€” Resource Cleanup (Manual vs Auto-close)

Kya seekhenge: finalize() last resort cleanup hai! Case 2 aur 3 mein developer ne close() nahi kiya β€” GC ne finalize() ke zariye auto-close kiya. But rely mat karo is par β€” better hai manually close karo! Real-world mein DB connection, file handler, socket.
P2

Finalize2.java β€” Exception in finalize() β€” GC ignore karta hai!

Kya seekhenge: finalize() mein exception aaya β€” GC ne ignore kiya aur object destroy kar diya! Program crash nahi hua. Isliye critical cleanup finalize() mein mat rakho β€” agar exception aaya toh cleanup hi nahi hoga!
P3

Finalize3.java β€” System.gc() vs Runtime.getRuntime().gc()

Kya seekhenge: System.gc() aur Runtime.getRuntime().gc() β€” dono same kaam karte hain! System.gc() internally Runtime.getRuntime().gc() call karta hai. Dono sirf request hain β€” guarantee nahi. Reverse order mein GC hota hai (LIFO style).
P4

Finalize4.java β€” GC Complete Demo (All Cases + Summary)

Kya seekhenge: Sabse important program! Teeno cases + finalize() + GC request sab ek jagah. Summary mein totalCreated vs totalDestroyed vs still alive. Interview ka favorite β€” poori GC story ek program mein!

πŸ“‹ Complete Revision Summary

Topic Key Point Eligible Hoga?
πŸ”΅ null assign obj = null β†’ reference hat gaya β†’ orphan βœ… Haan
🟒 Method scope Method end β†’ local vars destroy β†’ objects orphan βœ… Haan (agar return nahi kiya)
🟑 Reassign ref = newObj β†’ purana orphan βœ… Purana object eligible
πŸ”΄ finalize() Destroy se pehle JVM call karta hai β€” last cleanup chance ⚠️ Unpredictable! Rely mat karo
System.gc() GC request karo β€” same as Runtime.getRuntime().gc() ⚠️ Guarantee NAHI!

⚠️ Common Mistakes

Mistake ❌ Wrong βœ… Right
GC pe rely karna finalize() mein file close karo Manually close() call karo
System.gc() guarantee Assume GC chalega Just a request, no guarantee
Memory leak Static list mein add karte raho Remove objects when not needed
finalize() direct call obj.finalize() Never call directly!
Critical code in finalize DB commit in finalize() Use try-finally instead

⭐ Interview Questions

Java mein memory leak possible hai?
Haan! References hold karte raho β†’ GC collect nahi karega.
Example: Static collections mein objects add karte raho, remove karo nahi.
finalize() guaranteed call hoga?
NAHI! GC kab chalega pata nahi β†’ finalize() bhi unpredictable. Critical cleanup ke liye kabhi use mat karo!
System.gc() force karta hai GC?
NAHI! Sirf request hai β†’ JVM decide karta hai. System.gc() internally Runtime.getRuntime().gc() call karta hai β€” dono same hain.
Object eligible hone ke 3 ways?
1. null assign karo
2. Method scope end ho
3. Reference reassign karo
finalize() mein exception aaye to?
GC exception IGNORE karta hai aur object phir bhi destroy hota hai! Program crash nahi hota.
C++ vs Java memory management?
C++: Manual (delete) β†’ Memory leak possible if forgotten
Java: Automatic GC β†’ Developer manually free nahi karta

πŸ—‘οΈ Java Garbage Collector β€” Complete Revision Guide  |  Code same hai, readability better hai!

Golden Rule: File name = Class name exactly. GC_NullAssign1 class β†’ GC_NullAssign1.java file