Skip to content

emka.web.id

menulis pengetahuan – merekam peradaban

Menu
  • Home
  • Tutorial
  • Search
Menu

Sering Alami Bug Leak Memory di NodeJS? Coba Cek function setTimeout()!

Posted on June 13, 2024

Bagi developer Node.js, artikel ini penting untuk diketahui. Masalah yang dibahas di sini dapat menimbulkan banyak kesulitan. Ini terkait dengan cara Node.js menangani timeout. Singkatnya, Anda bisa dengan mudah membuat kebocoran memori [1] menggunakan fungsi setTimeout di Node.js.

setTimeout: Fungsi Jadul dengan Masalah Baru

Anda mungkin sudah familiar dengan fungsi setTimeout. Fungsi ini telah disediakan oleh browser selama bertahun-tahun. Fungsinya cukup mudah: Anda menjadwalkan fungsi untuk dipanggil nanti, dan Anda mendapatkan token yang dapat digunakan untuk menghapus timeout tersebut nantinya. Contoh singkatnya:

const token = setTimeout(() => {}, 100);
clearTimeout(token);

Di browser, token yang dikembalikan hanyalah sebuah angka. Namun, jika Anda melakukan hal yang sama di Node.js, token tersebut ternyata menjadi objek Timeout yang sebenarnya:

> setTimeout(() => {})
Timeout {
  _idleTimeout: 1,
  _idlePrev: [TimersList],
  _idleNext: [TimersList],
  _idleStart: 4312,
  _onTimeout: [Function (anonymous)],
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: false,
  [Symbol(refed)]: true,
  [Symbol(kHasPrimitive)]: false,
  [Symbol(asyncId)]: 78,
  [Symbol(triggerId)]: 6
}

Hal ini “membocorkan” sebagian internal dari bagaimana timeout diimplementasikan secara internal. Selama beberapa tahun terakhir, hal ini mungkin tidak menjadi masalah. Biasanya Anda menggunakan objek ini terutama sebagai token, mirip dengan yang Anda lakukan dengan angka. Mungkin terlihat seperti ini:

class MyThing {
  constructor() {
    this.timeout = setTimeout(() => { ... }, INTERVAL);
  }

  clearTimeout() {
    clearTimeout(this.timeout);
  }
}

Awas, Objek Timeout Bisa Bocor!

Sepanjang masa pakai MyThing, bahkan setelah clearTimeout dipanggil atau timeout selesai berjalan, objek tersebut tetap memegang timeout ini. Saat selesai atau dibatalkan, timeout ditandai sebagai “destroyed” dalam Node.js dan dihapus dari pelacakan internalnya. Namun, yang terjadi adalah objek Timeout ini sebenarnya bertahan sampai seseorang menimpa atau menghapus referensi this.timeout. Hal ini terjadi karena objek Timeout yang sebenarnya yang ditahan, bukan hanya sebuah token.

Lebih lanjut, ini berarti garbage collector (pengumpul sampah) tidak akan benar-benar mengumpulkan objek ini dan semua yang direferensikannya. Ini tampaknya tidak terlalu buruk karena objek Timeout terlihat agak besar, tetapi tidak terlalu besar. Bagian yang paling bermasalah kemungkinan besar adalah member _onTimeout di dalamnya yang mungkin menarik closure (penutupan fungsi), tetapi pada praktiknya mungkin sebagian besar baik-baik saja.

Namun, objek timeout dapat bertindak sebagai wadah untuk lebih banyak state (keadaan) yang tidak begitu jelas. API baru yang telah ditambahkan selama beberapa tahun terakhir disebut AsyncLocalStorage yang mendapatkan daya tarik, sedang melampirkan state tambahan ke semua timeout yang aktif. Penyimpanan lokal asinkron diimplementasikan dengan cara di mana timeout (dan promise serta konstruksi serupa) meneruskan state tersembunyi hingga dijalankan:

const { AsyncLocalStorage } = require('node:async_hooks');
const als = new AsyncLocalStorage();

let t;
als.run([...Array(10000)], () => {
  t = setTimeout(() => {
    //
    const theArray = als.getStore();
    assert(theArray.length === 10000);
  }, 10);
});

console.log(t);

Ketika Anda menjalankan kode ini, Anda akan melihat bahwa Timeout menyimpan referensi ke array besar ini:

Timeout {
  _idleTimeout: 100,
  _idlePrev: [TimersList],
  _idleNext: [TimersList],
  _idleStart: 10,
  _onTimeout: [Function (anonymous)],
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: false,
  [Symbol(refed)]: true,
  [Symbol(kHasPrimitive)]: false,
  [Symbol(asyncId)]: 2,
  [Symbol(triggerId)]: 1,
  [Symbol(kResourceStore)]: [Array] // referensi ke array besar disimpan di sini
}

Ini karena setiap penyimpanan lokal asinkron yang dibuat mendaftarkan dirinya sendiri dengan timeout dengan Symbol(kResourceStore) khusus yang bahkan tetap ada di sana setelah timeout dihapus atau timeout selesai berjalan. Ini

Terbaru

  • Survei Parpol Terbaru: Gerindra Unggul, PDIP Ketiga, PKB 5%
  • PKB Resmi Jalin Kerjasama dengan Institut Teknologi & Sains NU Kalimantan
  • Inilah Urutan Terbaru Pangkat TNI Angkatan Darat! (Update 2026)
  • Inilah Panduan Lengkap Operator Sekolah Mengelola SPTJM e-Ijazah dan Menghindari Kesalahan Fatal Data Kelulusan
  • Inilah Syarat dan Penilaian Seleksi Siswa Unggul ITB Jalur UTBK
  • Download Video Viral Guru Bahasa Inggris? Awas Berisi Virus!
  • PKB Minta Kasus C4bul Pendiri Ponpes Pati Tidak Ada Ampunan & Tuntutan Maksimal
  • Inilah Kronologi Video Viral Preman vs Sopir Di Sumedang
  • Ini Alasan UKP Pariwisata Disindir Konten Kreator Drone Gunung Rinjani
  • Inilah Kronologi Viral Video Dugaan Asusila Pegawai Disdik Pasuruan di Mobil Dinas
  • Polisi Polda Sumut Resmi Dipecat: Dari Video Viral Sampai Sidang Etik Ini Kronologinya
  • ASUS ExpertBook Ultra: Produk Flagship yang Cerminkan Kepemimpinan ASUS di Pasar Global
  • Inilah Tahapan dan Syarat Pendaftaran Beasiswa Garuda 2026 Gelombang II (25 Mei – 25 Juni 2026)
  • Ini Maksud Soal Tugas Guru Non-ASN Berakhir 2027!
  • Apa Itu Siscamling? Inilah Cara Mengaktifkan Paket Anti Spam Telkomsel
  • Sah, Nilai TKA Jadi Salah Satu Komponen Seleksi Siswa SPMB Secara Nasional 2026
  • Inilah 3 Lagi Pinjol Ilegal Menurut OJK Tahun 2026
  • Cara Login Proktor Browser OSN Mode Online, Uji Coba OSN Semua Jenjang Terbaru
  • Inilah Link Web Komunikasi OSN 2026 anbk.kemendikdasmen.go.id/osnk ANBK Kemendikdasmen untuk Simulasi
  • Inilah Jadwal Pembagian Deviden BBRI 2026, Siap-siap!
  • Ini Alasan Kenapa Followers IG Berkurang Sendiri Mei 2026?
  • Panduan Download vhd-osnk-2025_fresh versi 29.25.5.0 untuk Uji Coba OSN-K SMA SMP Sederajat 2026
  • Iniloh Syarat dan Komponen Nilai Seleksi Siswa Unggul ITB Jalur Nilai Rapor 2026/2027
  • Inilah Syarat dan Prosedur Ikut Seleksi Siswa Unggul ITB Jalur Tes Tulis 2026/2027
  • Inilah Kronologi & Latar Belakang Kasus Erin Taulany vs ART Hera: Masalah Facebook Pro?
  • Inilah Alasan Kenapa Ending Film Children of Heaven diubah di Indonesia
  • Ini Alasan Hanny Kristianto Cabut Sertifikat Mualaf Richard Lee
  • Inilah Syarat Dokumen SSU ITB 2024-2026 yang Wajib Kalian Siapkan Supaya Nggak Gagal Seleksi Administrasi
  • Inilah Episyrphus Balteatus, Lalat Unik Penyamar yang Sangat Bermanfaat bagi Taman Kalian
  • Inilah Cara Lolos Seleksi Siswa Unggul ITB Lewat Jalur Tes Tulis Biar Jadi Mahasiswa Ganesha
  • How to build a high-performance private photo cloud with Immich and TrueNAS SCALE
  • How to Build an Endgame Local AI Agent Setup Using an 8-Node NVIDIA Cluster with 1TB Memory
  • How to Master Windows Event Logs to Level Up Your Cybersecurity Investigations and SOC Career
  • How to Build Ultra-Resilient Databases with Amazon Aurora Global Database and RDS Proxy for Maximum Uptime and Performance
  • How to Build Real-Time Personalization Systems Using AWS Agentic AI to Make Every User Feel Special
  • How to Use Anthropic’s New AI Agents to Automate Your Financial Workflows Like a Pro
  • How to Secure Brand Deals Easily Using AI-Powered Professional Pitch Estimates in Just a Few Clicks
  • How to Master Google’s NotebookLM and Its Revolutionary AI Features for Smarter Learning
  • How to Use Claude AI in PowerPoint to Create Amazing Presentations Automatically
  • How to Utilize OpenAI’s Advanced Real-time Voice Models for Interactive Applications
  • Apa itu Spear-Phishing via npm? Ini Pengertian dan Cara Kerjanya yang Makin Licin
  • Apa Itu Predator Spyware? Ini Pengertian dan Kontroversi Penghapusan Sanksinya
  • Mengenal Apa itu TONESHELL: Backdoor Berbahaya dari Kelompok Mustang Panda
  • Siapa itu Kelompok Hacker Silver Fox?
  • Apa itu CVE-2025-52691 SmarterMail? Celah Keamanan Paling Berbahaya Tahun 2025

©2026 emka.web.id | Design: Newspaperly WordPress Theme