no message

parent 550df333
...@@ -255,7 +255,145 @@ try { ...@@ -255,7 +255,145 @@ try {
--- ---
# 📦 Pengurusan Memori: Stack, Heap & Garbage Collector dalam Java
---
## 📊 Jadual Ringkasan: Garbage Collector dalam Java
| Ciri | Penjelasan |
|-------------------------------|-----------------------------------------------------------------------------|
| Apa itu GC? | Proses automatik oleh JVM untuk membuang objek dalam heap yang tidak digunakan |
| Bila GC jalan? | Bila heap makin penuh, atau secara berkala ditentukan oleh JVM |
| Apa objek yang dibuang? | Objek yang **tiada lagi reference aktif** dari stack, static, atau thread |
| Kawasan utama GC bekerja | **Heap memory** |
| Apa yang tidak disentuh GC? | Stack memory, reference masih aktif, primitive types |
---
## 🔁 Carta Alir Garbage Collector
```
[JVM Berjalan]
[Cipta Objek Baru dalam Heap]
[Masih Ada Reference?]
┌──────────────┐
│ Ya │ → [Objek Aktif, Simpan Dalam Heap]
└────┬─────────┘
│ Tidak
[Objek Tiada Reference]
[Layak untuk Dibuang oleh GC]
[Garbage Collector Jalan]
[Buang Objek dari Heap, Kosongkan Memori]
[JVM Terus Berjalan]
```
## ✅ Contoh 1: Garbage Collector Buang Objek Bila Tiada Reference
```java
public class GCDemo {
static class Data {
int[] values = new int[1_000_000]; // Ambil ruang dalam heap
}
public static void main(String[] args) {
System.out.println("Program bermula...");
for (int i = 0; i < 10; i++) {
Data d = new Data(); // d hanya hidup dalam 1 pusingan
System.out.println("Objek " + (i + 1) + " dicipta");
}
System.out.println("Semua objek tiada reference, GC boleh buang bila perlu.");
}
}
```
### 💡 Penjelasan:
- `Data d` hanya wujud dalam setiap pusingan
- Bila pusingan seterusnya bermula, `d` yang lama **hilang reference**
- Objek lama di heap jadi **layak dibuang oleh GC**
### ✅ Expected Output:
```
Program bermula...
Objek 1 dicipta
Objek 2 dicipta
...
Objek 10 dicipta
Semua objek tiada reference, GC boleh buang bila perlu.
```
---
## ❌ Contoh 2: Memory Leak — Objek Masih Dirujuk Walaupun Tak Digunakan Lagi
```java
import java.util.ArrayList;
import java.util.List;
public class MemoryLeakDemo {
static List<Data> cache = new ArrayList<>();
static class Data {
int[] values = new int[1_000_000]; // 1 juta int = ±4MB
}
public static void main(String[] args) {
System.out.println("Program mula (dengan memory leak)...");
for (int i = 0; i < 1000; i++) {
cache.add(new Data()); // Objek masih dirujuk oleh `cache`
System.out.println("Tambah objek ke-" + (i + 1));
}
System.out.println("Selesai. Semua objek masih dirujuk — GC tak boleh buang.");
}
}
```
### ❗ Penjelasan:
- Semua objek `new Data()` masih disimpan dalam `static List cache`
- GC **tak boleh buang** sebab reference masih ada
- Bila terlalu banyak objek disimpan, **heap penuh → `OutOfMemoryError`**
### ❌ Expected Output:
```
Program mula (dengan memory leak)...
Tambah objek ke-1
Tambah objek ke-2
...
Tambah objek ke-300
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
```
---
## 📌 Jalankan dengan GC Log (opsyenal):
```bash
java -Xmx128m -XX:+PrintGC GCDemo
```
---
## ✅ Ringkasan
| Contoh | Apa Jadi? |
|----------------------------------|-----------------------------------------------|
| `GCDemo` | GC boleh buang objek selepas hilang reference |
| `MemoryLeakDemo` | Semua objek masih dirujuk → GC tak boleh buang |
| `static` atau `List` tanpa buang | Punca memory leak biasa dalam Java |
---
## 🧠 Asas Pemrograman Berorientasikan Objek (OOP) ## 🧠 Asas Pemrograman Berorientasikan Objek (OOP)
......
No preview for this file type
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment