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

  • Inilah Cara Pakai Google Maps Offline Biar Mudik Lebaran 2026 Nggak Nyasar Meski Tanpa Sinyal!
  • Inilah Alasan Mahkamah Agung Tolak Kasasi Google, Denda Rp202,5 Miliar Resmi Menanti Akibat Praktik Monopoli
  • Inilah Cara Daftar dan Syarat SPMB SMK Boarding Jawa Tengah 2026, Sekolah Gratis Sampai Lulus!
  • Inilah Daftar Sekolah Kedinasan 2026 untuk Lulusan SMK, Bisa Kuliah Gratis dan Berpeluang Besar Langsung Jadi CPNS!
  • Inilah Pajak TER: Skema Baru PPh 21 yang Nggak Bikin Pusing, Begini Cara Hitungnya!
  • Inilah Jadwal Resmi Jam Buka Tol Jogja-Solo Segmen Prambanan-Purwomartani Saat Mudik Lebaran 2026
  • Inilah Cara Mendapatkan Witherbloom di Fisch Roblox, Rahasia Menangkap Ikan Paling Sulit di Toxic Grove!
  • Kenapa Indomart Point Bisa Kalahkan Bisnis Kafe?
  • Inilah Cara Mendapatkan Rotten Seed di Fisch Roblox, Lokasi Rahasia di Toxic Grove Buat Unlock Toxic Lotus!
  • Inilah Cara Zakat Crypto Kalian Bisa Jadi Pengurang Pajak Berdasarkan Aturan Resmi Pemerintah!
  • Inilah Perbandingan Airwallex vs Payoneer 2026: Jangan Sampai Profit Kalian Ludes Gara-Gara Biaya Admin!
  • Inilah Roadmap 7 Tahap Bangun Bisnis Digital dari Nol Biar Nggak Cuma Putar-Putar di Tempat!
  • Inilah Cara Tetap Gajian dari YouTube Meski View Masih Ratusan, Penasaran?
  • Inilah Alasan Akun TikTok Affiliate GMV 270 Juta Kena Banned Permanen!
  • Inilah Bahaya Astute Beta Server APK, Jangan Sembarang Klik Link Download FF Kipas 2026!
  • Inilah Bahaya Nonton Film di LK21 dan IndoXXI, Awas Data Pribadi dan Saldo Rekening Kalian Bisa Ludes!
  • Inilah Kronologi & Video Lengkap Kasus Sejoli Tambelangan Sampang Viral, Ternyata Gini Awal Mulanya!
  • Inilah Alasan Kenapa Koin Nego Neko Shopee Nggak Bisa Dipakai Bayar Full dan Cara Rahasia Dapetinnya!
  • Inilah Cara Menjawab Pertanyaan Apakah di Sekolahmu Sudah Ada IFP/PID dengan Benar dan Profesional
  • Inilah Fakta Isu Roblox Diblokir di Indonesia 2026, Benarkah Akan Ditutup Total?
  • Inilah Penyebab dan Cara Mengatasi FF Kipas My ID Verify UID Biar Akun Tetap Aman
  • Inilah Deretan HP RAM 8GB Harga di Bawah 2 Juta Terbaik 2026, Spek Dewa Tapi Nggak Bikin Kantong Jebol!
  • Contoh Cara Buat SK Panitia TKA 2026
  • Inilah Cara Download Point Blank ID Versi Terbaru 2026, Gampang Banget Ternyata!
  • Inilah Persiapan Lengkap Gladi Bersih TKA 2026 SD dan SMP: Jadwal, Teknis Proktor, dan Aturan yang Wajib Kalian Tahu
  • Inilah Aturan Lengkapnya, Apakah Zakat dalam Bentuk Barang Bisa Mengurangi Pajak Penghasilan Kalian?
  • Inilah Kenapa KBLI Sangat Penting Buat Bisnis Digital dan Gini Caranya Biar Kalian Nggak Salah Pilih Kode
  • Inilah Fitur Keren ONLYOFFICE Docs 9.3, Cara Baru Edit PDF dan Dokumen Lebih Efisien!
  • Inilah Cara Banjir Komisi Shopee Affiliate Hanya Dalam 7 Hari Saja
  • Cara Download Aplikasi BUSSID Versi 3.7.1 Masih Dicari dan Link Download Aman Mediafire
  • How to Enable SSH in Oracle VirtualBox for Beginners
  • How to Intercept Secret IoT Camera Traffic
  • Build Ultra-Fast and Tiny Desktop Apps with Electrobun: A Beginner’s Guide
  • The Ultimate 2026 Coding Roadmap: How to Master Software Engineering with AI Agents
  • How to Master Cloud Infrastructure with Ansible and Terraform
  • How to Have OpenClaw Agent that Work for You 24/7/365?
  • A Complete Guide to Using Abacus.AI Deep Agent for Research and AI Presentation Generator
  • How to Setup Clawdbot Computer Agents Client
  • Bytedance Helios: How to Generate Real-Time Long AI Videos on Your Own Computer
  • New Perplexity AI Feature, March 2026 is Insane
  • 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