Mendeteksi dan Memperbaiki Kebocoran Memori
Identifikasi pola kebocoran memori yang umum (koleksi statis, listener, cache) dan perbaikilah.
Mendeteksi dan Memperbaiki Kebocoran Memori adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Apa Itu Kebocoran Memori di Java?
Kebocoran memori Java terjadi ketika objek tidak lagi diperlukan tetapi tetap dapat dijangkau secara kuat, sehingga GC tidak dapat mengambilnya kembali. Heap terus membesar hingga OutOfMemoryError dilemparkan.
Akumulasi Koleksi Statis
Bidang statis yang menyimpan koleksi yang terus bertambah adalah kebocoran klasik. Objek yang ditambahkan tetapi tidak pernah dihapus tetap hidup selama masa hidup aplikasi.
public class Cache {
// LEAK: static list grows forever if items are never removed
private static final List<Object> items = new ArrayList<>();
public static void add(Object o) { items.add(o); }
// Fix: add a remove() method or use a bounded cache
}Pendengar Peristiwa yang Tidak Didaftarkan
Mendaftarkan pendengar tanpa pernah menghapusnya membuat pendengar tersebut dan objek apa pun yang dirujuknya tetap hidup. Selalu batalkan pendaftaran pendengar ketika sudah tidak diperlukan.
// Leak:
sensor.addListener(new DataLogger());
// Fix:
DataLogger logger = new DataLogger();
sensor.addListener(logger);
// ... when done:
sensor.removeListener(logger);Variabel ThreadLocal yang Tidak Dibersihkan
Dalam kumpulan utas, nilai ThreadLocal tetap ada di antara tugas karena utas digunakan kembali. Jika tidak dibersihkan, data dari suatu tugas bocor ke tugas berikutnya pada utas yang sama.
private static final ThreadLocal<MyContext> CTX = new ThreadLocal<>();
// Always clean up after each task:
try {
CTX.set(new MyContext(requestId));
doWork();
} finally {
CTX.remove(); // prevents leak in pooled threads
}Kebocoran Pemuat Kelas pada Aplikasi yang Diterapkan Saat Berjalan
Dalam wadah servlet, setiap penerapan menggunakan pemuat kelas baru. Jika ada kelas yang menyimpan referensi statis ke kelas dari pemuat kelas lama, seluruh pemuat kelas lama beserta semua kelasnya tidak dapat dikumpulkan oleh GC.
Mendeteksi Kebocoran dengan Dump Memori Heap
Ambil dump heap dengan jmap -dump:format=b,file=heap.hprof <pid>, lalu buka dump tersebut di Eclipse MAT atau VisualVM untuk menemukan objek terbesar yang dipertahankan dan akar GC-nya.
// Take a heap dump:
jmap -dump:live,format=b,file=heap.hprof $(jps | grep MyApp | cut -d" " -f1)
// Or trigger on OOM:
// -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap.hprofPenganalisis Memori Eclipse (MAT)
Laporan "Kandidat Kebocoran" milik MAT secara otomatis mengidentifikasi objek dengan heap yang dipertahankan dalam jumlah besar dan menampilkan jalur dari akar GC. Mulailah dari tampilan "Pohon Dominator" untuk menemukan penyebab terbesar.
Menggunakan WeakReference untuk Menghindari Kebocoran
Bungkus objek tembolok atau pendengar dengan WeakReference. GC dapat mengambilnya kembali saat tekanan memori meningkat. Selalu periksa apakah hasil get() bernilai null.
Map<String, WeakReference<Image>> imageCache = new HashMap<>();
imageCache.put("logo", new WeakReference<>(loadImage("logo.png")));
Image logo = imageCache.get("logo") != null ? imageCache.get("logo").get() : null;
if (logo == null) logo = reload("logo.png"); // re-load if GCedTembolok Terbatas dengan LRU LinkedHashMap
Timpa removeEldestEntry dalam LinkedHashMap untuk membatasi ukuran tembolok dan secara otomatis mengeluarkan entri yang paling lama tidak digunakan.
Map<String, String> lruCache = new LinkedHashMap<>(16, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry<String, String> e) {
return size() > 100; // evict when over 100 entries
}
};Membuat Profil Alokasi dengan Perekam Penerbangan Java
JFR (Perekam Penerbangan Java) merekam profil alokasi dengan beban tambahan minimal. Aktifkan dengan -XX:StartFlightRecording dan analisis menggunakan Kontrol Misi JDK.
// Start a 60-second JFR recording:
java -XX:StartFlightRecording=duration=60s,filename=rec.jfr MyApp
// Or via jcmd:
jcmd <pid> JFR.start duration=60s filename=rec.jfrMemperbaiki Kebocoran: Daftar Periksa
Periksa: koleksi statis, pendengar yang tidak didaftarkan, ThreadLocals dalam kumpulan, kebocoran koneksi/aliran (gunakan pengelolaan sumber daya otomatis), referensi kelas dalam ke objek luar, dan tembolok tanpa pengeluaran.
Pemeriksaan Singkat
Flag JVM apa yang secara otomatis membuang heap saat OutOfMemoryError dilemparkan?
Ringkasan
Sumber kebocoran Java yang umum: koleksi statis, pendengar yang tidak didaftarkan, ThreadLocals dalam kumpulan, dan tembolok tak terbatas. Deteksi menggunakan dump heap + MAT. Perbaiki dengan WeakReferences, struktur berbatas, dan selalu hapus referensi setelah selesai digunakan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mendeteksi dan Memperbaiki Kebocoran Memori” gratis?
Ya — teks lengkap “Mendeteksi dan Memperbaiki Kebocoran Memori” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mendeteksi dan Memperbaiki Kebocoran Memori”?
Identifikasi pola kebocoran memori yang umum (koleksi statis, listener, cache) dan perbaikilah. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Mendeteksi dan Memperbaiki Kebocoran Memori” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Region Heap JVM dan Siklus Hidup Objek
- Algoritma GC: Serial, G1, ZGC, Shenandoah
- Mendeteksi dan Memperbaiki Kebocoran Memori
- Flag Penyetelan GC dan Pembuatan Profil dengan JVisualVM