Back to blog
Backend

WeakMap: Cara Bikin Cache di JavaScript yang Gak Bikin Memory Bocor

Budi bikin cache pakai Map biasa untuk menyimpan hasil hitungan tiap object User. Object User-nya sudah lama dihapus dari mana-mana, tapi cache-nya masih menggenggam erat dan menolak dilupakan.

super admin·02 September 2026·2 min read
WeakMap: Cara Bikin Cache di JavaScript yang Gak Bikin Memory Bocor
Article Content

Bayangin Budi Bikin Cache Hasil Hitungan per User...

Bayangin Budi membuat fitur yang menghitung skor reputasi tiap objek User, dan karena hitungannya berat, Budi menyimpannya di sebuah cache memakai Map biasa supaya tidak dihitung ulang terus-menerus:

const reputationCache = new Map();

function getReputation(userObject) {
  if (reputationCache.has(userObject)) {
    return reputationCache.get(userObject);
  }
  const score = calculateHeavyScore(userObject);
  reputationCache.set(userObject, score);
  return score;
}

Aplikasinya berjalan lancar di awal. Tapi setelah berjam-jam menangani ribuan request, dan setiap request membuat objek User baru yang seharusnya sudah tidak dipakai lagi setelah selesai diproses, penggunaan RAM server terus naik dan tidak pernah turun, sampai akhirnya crash kehabisan memori.

Masalahnya: 'Map' Menggenggam Objeknya Selamanya, Walau Tak Ada yang Membutuhkannya Lagi

JavaScript punya Garbage Collector yang otomatis membuang objek dari memori begitu tidak ada satupun bagian program lain yang masih "memegang" referensinya. Masalahnya, Map biasa dihitung sebagai salah satu pemegang referensi yang sah — begitu sebuah objek User dijadikan key di dalam reputationCache, Garbage Collector menganggap objek itu masih dipakai selamanya, walaupun bagian kode lain sudah lama selesai dan tidak butuh objek itu lagi. Cache yang niatnya membantu performa, malah diam-diam jadi penyebab kebocoran memori.

Nah, Di Sinilah 'WeakMap' Masuk!

WeakMap terlihat mirip Map biasa, tapi punya satu sifat ajaib: referensi ke objek yang dijadikan key di dalamnya bersifat "lemah" (weak)tidak dihitung oleh Garbage Collector sebagai alasan untuk mempertahankan objek itu tetap hidup di memori.

const reputationCache = new WeakMap();

function getReputation(userObject) {
  if (reputationCache.has(userObject)) {
    return reputationCache.get(userObject);
  }
  const score = calculateHeavyScore(userObject);
  reputationCache.set(userObject, score);
  return score;
}

Begitu objek User tertentu sudah tidak dipegang oleh bagian kode manapun yang lain, Garbage Collector akan tetap membersihkannya dari memori seperti biasa — dan begitu objek itu dibersihkan, entri cache miliknya di dalam WeakMap otomatis ikut menghilang dengan sendirinya, tanpa perlu dihapus manual.

Intinya: Pakai WeakMap (atau WeakSet untuk kumpulan) setiap kali kamu ingin menempelkan data tambahan atau cache pada sebuah objek tanpa ikut campur mengatur kapan objek itu boleh dibuang dari memori. Catatan: karena sifatnya yang "lemah" ini, WeakMap tidak bisa di-iterasi (tidak ada .keys() atau .forEach()) — dan itu memang disengaja.

Mau langsung pakai template?

Jelajahi template gratis dan premium di TampilKit untuk mempercepat proses development project kamu.

Browse Templates