Menguasai memory management dan performance optimization adalah kunci bagi developer JavaScript yang ingin membangun aplikasi responsif, scalable, dan bebas memory leaks.
Bab ini membahas garbage collection, WeakMap & WeakSet, profiling, optimisasi loop & DOM, serta event delegation & throttling.
Contents
1. Garbage Collection (GC) & Memory Leaks
JavaScript secara otomatis melakukan garbage collection (GC), yaitu proses membuang objek yang tidak lagi digunakan untuk membebaskan memori.
let obj = { name: "Alice" };
obj = null; // Objek "Alice" siap di-GC
Penyebab Memory Leak
- Global variables yang tidak dibersihkan
- Closures yang menyimpan referensi besar
- DOM references yang tidak dihapus
- Timers & intervals yang tidak dibersihkan
Tips mencegah memory leak:
const interval = setInterval(() => console.log("Running..."), 1000);
// Jangan lupa clear interval saat tidak dibutuhkan
clearInterval(interval);
2. WeakMap & WeakSet
WeakMap dan WeakSet menyimpan objek secara weak reference, sehingga tidak mencegah garbage collection.
// WeakMap
const wm = new WeakMap();
let obj = {};
wm.set(obj, "meta data");
console.log(wm.get(obj)); // meta data
obj = null; // Objek bisa di-GC otomatis
// WeakSet
const ws = new WeakSet();
let user = { name: "Bob" };
ws.add(user);
user = null; // Bisa di-GC
Manfaat:
- Menghindari memory leak
- Cocok untuk menyimpan data metadata objek
- Tidak enumerable → lebih aman untuk internal storage
3. Profiling JS Performance
Profiling membantu menemukan bottleneck dan optimasi.
Browser DevTools:
- Performance tab → merekam timeline eksekusi
- Memory tab → cek snapshot memory, menemukan memory leaks
- Coverage tab → menemukan kode yang tidak dipakai
Tips:
- Fokus pada re-rendering DOM yang sering
- Hati-hati dengan nested loops dan callback heavy
4. Optimizing Loops & DOM Updates
Optimasi Loops
- Gunakan
forklasik untuk performa tinggi di loop besar - Hindari penghitungan panjang array setiap iterasi
- Gunakan map/filter/reduce untuk clean code, tapi perhatikan performa
// Hindari menghitung arr.length di setiap iterasi
for (let i = 0, len = arr.length; i < len; i++) {
console.log(arr[i]);
}
Optimasi DOM Updates
- Batch DOM updates → ubah fragment di memory, baru append ke DOM
- Gunakan document fragment untuk manipulasi banyak elemen
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
const div = document.createElement('div');
div.textContent = `Item ${i}`;
fragment.appendChild(div);
}
document.body.appendChild(fragment); // Hanya satu reflow
5. Event Delegation & Throttling
Event Delegation
Alih-alih menambahkan event listener ke banyak elemen, tambahkan listener ke parent.
document.querySelector('#list').addEventListener('click', (e) => {
if (e.target.tagName === 'LI') {
console.log(`Clicked ${e.target.textContent}`);
}
});
Manfaat:
- Mengurangi memory usage
- Lebih efisien untuk elemen dinamis
Throttling
Mengontrol frekuensi eksekusi event untuk mengurangi beban CPU:
function throttle(fn, limit) {
let inThrottle;
return function(...args) {
if (!inThrottle) {
fn.apply(this, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
window.addEventListener('scroll', throttle(() => {
console.log('Scroll fired!');
}, 200));
Kesimpulan
Bab ini membekali kamu dengan teknik memory management & performance optimization untuk membuat aplikasi JavaScript:
- Memahami garbage collection & menghindari memory leaks
- Memanfaatkan WeakMap & WeakSet untuk data metadata
- Profiling dengan DevTools untuk menemukan bottleneck
- Optimasi loops & batch DOM updates untuk performa tinggi
- Event delegation & throttling untuk event-heavy aplikasi
Dengan menguasai pola ini, aplikasi kamu akan lebih cepat, hemat memori, dan scalable, siap menangani real-time dan high-performance scenarios.