[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-branding":3,"content-de-discord-memory-leaks":8,"public-ads-config":1484},{"siteName":4,"primaryColor":5,"accentColor":6,"faviconUrl":7,"logoUrl":7},"KiroCloud","#ffffff","#888888","",{"id":9,"title":10,"author":11,"body":12,"category":11,"description":1468,"extension":1469,"lastUpdated":11,"meta":1470,"navigation":300,"order":1471,"path":1472,"readTime":11,"seo":1473,"stem":1482,"__hash__":1483},"docs\u002Fdocs\u002Fde\u002Fdiscord-memory-leaks.md","[object Object]",null,{"type":13,"value":14,"toc":1456},"minimark",[15,20,29,36,39,44,47,52,59,79,82,86,97,221,223,227,234,702,706,756,758,762,768,1214,1216,1220,1231,1353,1359,1361,1365,1452],[16,17,19],"h1",{"id":18},"discordjs-memory-leaks-beheben-v8-heap-analyse-cache-strategien","Discord.js Memory Leaks beheben: V8 Heap-Analyse & Cache-Strategien",[21,22,23,24,28],"p",{},"Discord-Bots, die auf großen Servern betrieben werden oder über Wochen ohne Neustart laufen, leiden häufig unter schleichendem RAM-Wachstum. Ein Bot, der nach dem Start 120 MB Arbeitsspeicher belegt, kann innerhalb weniger Tage mehrere Gigabyte verbrauchen, bis die Node.js-Runtime den Prozess mit einem ",[25,26,27],"code",{},"FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory"," beendet.",[21,30,31,32,35],{},"In diesem Leitfaden analysieren wir die tatsächlichen Ursachen von Speicherlecks in ",[25,33,34],{},"discord.js v14",", demonstrieren die V8 Heap-Snapshot-Analyse und implementieren produktionsreife Cache-Sweeping-Strategien.",[37,38],"hr",{},[40,41,43],"h2",{"id":42},"_1-die-hauptursachen-für-memory-leaks-in-discord-bots","1. Die Hauptursachen für Memory Leaks in Discord-Bots",[21,45,46],{},"In JavaScript verhindert der automatische Garbage Collector (GC), dass nicht mehr referenzierter Speicher weiter belegt bleibt. Ein Memory Leak entsteht dann, wenn Objekte im Heap verbleiben, weil unbeabsichtigte Referenzen aus dem Root-Scope (z. B. globale Maps, Closures oder ungelöschte Event-Listener) auf sie zeigen.",[48,49,51],"h3",{"id":50},"a-der-unbegrenzte-standard-cache-von-discordjs","A. Der unbegrenzte Standard-Cache von Discord.js",[21,53,54,55,58],{},"In der Standardkonfiguration legt ",[25,56,57],{},"discord.js"," fast jedes empfangene Event im internen Cache ab:",[60,61,62,70,76],"ul",{},[63,64,65,66,69],"li",{},"Jede empfangene Nachricht (",[25,67,68],{},"client.channels.cache.get(id).messages",")",[63,71,72,73,69],{},"Jeder Server-Benutzer (",[25,74,75],{},"guild.members.cache",[63,77,78],{},"Jeder Voice-State und jede Präsenz-Aktualisierung",[21,80,81],{},"Auf Servern mit 50.000 Mitgliedern führt dies schnell dazu, dass Hunderttausende User- und Message-Objekte im RAM gehalten werden, selbst wenn sie nie wieder benötigt werden.",[48,83,85],{"id":84},"b-akkumulierte-event-listener-in-modulen","B. Akkumulierte Event-Listener in Modulen",[21,87,88,89,92,93,96],{},"Ein klassischer Fehler in modularen Bots: Bei jedem Reload eines Befehls oder Moduls wird ",[25,90,91],{},"client.on(...)"," erneut aufgerufen, ohne dass der alte Listener via ",[25,94,95],{},"client.off(...)"," deregistriert wurde:",[98,99,103],"pre",{"className":100,"code":101,"language":102,"meta":7,"style":7},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F GEFÄHRLICH: Erzeugt bei jedem Modul-Reload einen neuen Listener im Heap\nexport function initTicketWatcher(client: Client) {\n  client.on('messageCreate', (message) => {\n    handleTicketMessage(message);\n  });\n}\n","typescript",[25,104,105,114,149,190,205,215],{"__ignoreMap":7},[106,107,110],"span",{"class":108,"line":109},"line",1,[106,111,113],{"class":112},"sHwdD","\u002F\u002F GEFÄHRLICH: Erzeugt bei jedem Modul-Reload einen neuen Listener im Heap\n",[106,115,117,121,125,129,133,137,140,144,146],{"class":108,"line":116},2,[106,118,120],{"class":119},"s7zQu","export",[106,122,124],{"class":123},"spNyl"," function",[106,126,128],{"class":127},"s2Zo4"," initTicketWatcher",[106,130,132],{"class":131},"sMK4o","(",[106,134,136],{"class":135},"sHdIc","client",[106,138,139],{"class":131},":",[106,141,143],{"class":142},"sBMFI"," Client",[106,145,69],{"class":131},[106,147,148],{"class":131}," {\n",[106,150,152,156,159,162,165,168,172,174,177,180,183,185,188],{"class":108,"line":151},3,[106,153,155],{"class":154},"sTEyZ","  client",[106,157,158],{"class":131},".",[106,160,161],{"class":127},"on",[106,163,132],{"class":164},"swJcz",[106,166,167],{"class":131},"'",[106,169,171],{"class":170},"sfazB","messageCreate",[106,173,167],{"class":131},[106,175,176],{"class":131},",",[106,178,179],{"class":131}," (",[106,181,182],{"class":135},"message",[106,184,69],{"class":131},[106,186,187],{"class":123}," =>",[106,189,148],{"class":131},[106,191,193,196,198,200,202],{"class":108,"line":192},4,[106,194,195],{"class":127},"    handleTicketMessage",[106,197,132],{"class":164},[106,199,182],{"class":154},[106,201,69],{"class":164},[106,203,204],{"class":131},";\n",[106,206,208,211,213],{"class":108,"line":207},5,[106,209,210],{"class":131},"  }",[106,212,69],{"class":164},[106,214,204],{"class":131},[106,216,218],{"class":108,"line":217},6,[106,219,220],{"class":131},"}\n",[37,222],{},[40,224,226],{"id":225},"_2-v8-heap-snapshots-zur-ursachenanalyse-erstellen","2. V8 Heap-Snapshots zur Ursachenanalyse erstellen",[21,228,229,230,233],{},"Um herauszufinden, welche Objekte den Heap blockieren, erstellen wir programmatisch Heap-Dumps mit dem nativen ",[25,231,232],{},"v8","-Modul von Node.js:",[98,235,237],{"className":100,"code":236,"language":102,"meta":7,"style":7},"import v8 from 'node:v8';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport function takeHeapSnapshot(label: string = 'leak-audit'): string {\n  const memUsage = process.memoryUsage();\n  console.log(`[Heap Profiler] RSS: ${(memUsage.rss \u002F 1024 \u002F 1024).toFixed(2)} MB, Heap: ${(memUsage.heapUsed \u002F 1024 \u002F 1024).toFixed(2)} MB`);\n\n  const filename = path.join(process.cwd(), `heap-${label}-${Date.now()}.heapsnapshot`);\n  const snapshotStream = v8.getHeapSnapshot();\n  const fileStream = fs.createWriteStream(filename);\n\n  snapshotStream.pipe(fileStream);\n\n  fileStream.on('finish', () => {\n    console.log(`[Heap Profiler] Snapshot erfolgreich gespeichert: ${filename}`);\n  });\n\n  return filename;\n}\n",[25,238,239,260,278,296,302,338,361,463,468,538,560,587,592,612,617,645,673,682,687,697],{"__ignoreMap":7},[106,240,241,244,247,250,253,256,258],{"class":108,"line":109},[106,242,243],{"class":119},"import",[106,245,246],{"class":154}," v8 ",[106,248,249],{"class":119},"from",[106,251,252],{"class":131}," '",[106,254,255],{"class":170},"node:v8",[106,257,167],{"class":131},[106,259,204],{"class":131},[106,261,262,264,267,269,271,274,276],{"class":108,"line":116},[106,263,243],{"class":119},[106,265,266],{"class":154}," fs ",[106,268,249],{"class":119},[106,270,252],{"class":131},[106,272,273],{"class":170},"node:fs",[106,275,167],{"class":131},[106,277,204],{"class":131},[106,279,280,282,285,287,289,292,294],{"class":108,"line":151},[106,281,243],{"class":119},[106,283,284],{"class":154}," path ",[106,286,249],{"class":119},[106,288,252],{"class":131},[106,290,291],{"class":170},"node:path",[106,293,167],{"class":131},[106,295,204],{"class":131},[106,297,298],{"class":108,"line":192},[106,299,301],{"emptyLinePlaceholder":300},true,"\n",[106,303,304,306,308,311,313,316,318,321,324,326,329,331,334,336],{"class":108,"line":207},[106,305,120],{"class":119},[106,307,124],{"class":123},[106,309,310],{"class":127}," takeHeapSnapshot",[106,312,132],{"class":131},[106,314,315],{"class":135},"label",[106,317,139],{"class":131},[106,319,320],{"class":142}," string",[106,322,323],{"class":131}," =",[106,325,252],{"class":131},[106,327,328],{"class":170},"leak-audit",[106,330,167],{"class":131},[106,332,333],{"class":131},"):",[106,335,320],{"class":142},[106,337,148],{"class":131},[106,339,340,343,346,348,351,353,356,359],{"class":108,"line":217},[106,341,342],{"class":123},"  const",[106,344,345],{"class":154}," memUsage",[106,347,323],{"class":131},[106,349,350],{"class":154}," process",[106,352,158],{"class":131},[106,354,355],{"class":127},"memoryUsage",[106,357,358],{"class":164},"()",[106,360,204],{"class":131},[106,362,364,367,369,372,374,377,380,383,386,388,391,394,398,401,403,405,407,410,412,415,417,420,423,425,427,429,432,434,436,438,440,442,444,446,448,450,452,454,457,459,461],{"class":108,"line":363},7,[106,365,366],{"class":154},"  console",[106,368,158],{"class":131},[106,370,371],{"class":127},"log",[106,373,132],{"class":164},[106,375,376],{"class":131},"`",[106,378,379],{"class":170},"[Heap Profiler] RSS: ",[106,381,382],{"class":131},"${",[106,384,385],{"class":154},"(memUsage",[106,387,158],{"class":131},[106,389,390],{"class":154},"rss ",[106,392,393],{"class":131},"\u002F",[106,395,397],{"class":396},"sbssI"," 1024",[106,399,400],{"class":131}," \u002F",[106,402,397],{"class":396},[106,404,69],{"class":154},[106,406,158],{"class":131},[106,408,409],{"class":127},"toFixed",[106,411,132],{"class":154},[106,413,414],{"class":396},"2",[106,416,69],{"class":154},[106,418,419],{"class":131},"}",[106,421,422],{"class":170}," MB, Heap: ",[106,424,382],{"class":131},[106,426,385],{"class":154},[106,428,158],{"class":131},[106,430,431],{"class":154},"heapUsed ",[106,433,393],{"class":131},[106,435,397],{"class":396},[106,437,400],{"class":131},[106,439,397],{"class":396},[106,441,69],{"class":154},[106,443,158],{"class":131},[106,445,409],{"class":127},[106,447,132],{"class":154},[106,449,414],{"class":396},[106,451,69],{"class":154},[106,453,419],{"class":131},[106,455,456],{"class":170}," MB",[106,458,376],{"class":131},[106,460,69],{"class":164},[106,462,204],{"class":131},[106,464,466],{"class":108,"line":465},8,[106,467,301],{"emptyLinePlaceholder":300},[106,469,471,473,476,478,481,483,486,488,491,493,496,498,500,503,506,508,510,512,515,517,520,522,525,527,529,532,534,536],{"class":108,"line":470},9,[106,472,342],{"class":123},[106,474,475],{"class":154}," filename",[106,477,323],{"class":131},[106,479,480],{"class":154}," path",[106,482,158],{"class":131},[106,484,485],{"class":127},"join",[106,487,132],{"class":164},[106,489,490],{"class":154},"process",[106,492,158],{"class":131},[106,494,495],{"class":127},"cwd",[106,497,358],{"class":164},[106,499,176],{"class":131},[106,501,502],{"class":131}," `",[106,504,505],{"class":170},"heap-",[106,507,382],{"class":131},[106,509,315],{"class":154},[106,511,419],{"class":131},[106,513,514],{"class":170},"-",[106,516,382],{"class":131},[106,518,519],{"class":154},"Date",[106,521,158],{"class":131},[106,523,524],{"class":127},"now",[106,526,358],{"class":154},[106,528,419],{"class":131},[106,530,531],{"class":170},".heapsnapshot",[106,533,376],{"class":131},[106,535,69],{"class":164},[106,537,204],{"class":131},[106,539,541,543,546,548,551,553,556,558],{"class":108,"line":540},10,[106,542,342],{"class":123},[106,544,545],{"class":154}," snapshotStream",[106,547,323],{"class":131},[106,549,550],{"class":154}," v8",[106,552,158],{"class":131},[106,554,555],{"class":127},"getHeapSnapshot",[106,557,358],{"class":164},[106,559,204],{"class":131},[106,561,563,565,568,570,573,575,578,580,583,585],{"class":108,"line":562},11,[106,564,342],{"class":123},[106,566,567],{"class":154}," fileStream",[106,569,323],{"class":131},[106,571,572],{"class":154}," fs",[106,574,158],{"class":131},[106,576,577],{"class":127},"createWriteStream",[106,579,132],{"class":164},[106,581,582],{"class":154},"filename",[106,584,69],{"class":164},[106,586,204],{"class":131},[106,588,590],{"class":108,"line":589},12,[106,591,301],{"emptyLinePlaceholder":300},[106,593,595,598,600,603,605,608,610],{"class":108,"line":594},13,[106,596,597],{"class":154},"  snapshotStream",[106,599,158],{"class":131},[106,601,602],{"class":127},"pipe",[106,604,132],{"class":164},[106,606,607],{"class":154},"fileStream",[106,609,69],{"class":164},[106,611,204],{"class":131},[106,613,615],{"class":108,"line":614},14,[106,616,301],{"emptyLinePlaceholder":300},[106,618,620,623,625,627,629,631,634,636,638,641,643],{"class":108,"line":619},15,[106,621,622],{"class":154},"  fileStream",[106,624,158],{"class":131},[106,626,161],{"class":127},[106,628,132],{"class":164},[106,630,167],{"class":131},[106,632,633],{"class":170},"finish",[106,635,167],{"class":131},[106,637,176],{"class":131},[106,639,640],{"class":131}," ()",[106,642,187],{"class":123},[106,644,148],{"class":131},[106,646,648,651,653,655,657,659,662,664,666,669,671],{"class":108,"line":647},16,[106,649,650],{"class":154},"    console",[106,652,158],{"class":131},[106,654,371],{"class":127},[106,656,132],{"class":164},[106,658,376],{"class":131},[106,660,661],{"class":170},"[Heap Profiler] Snapshot erfolgreich gespeichert: ",[106,663,382],{"class":131},[106,665,582],{"class":154},[106,667,668],{"class":131},"}`",[106,670,69],{"class":164},[106,672,204],{"class":131},[106,674,676,678,680],{"class":108,"line":675},17,[106,677,210],{"class":131},[106,679,69],{"class":164},[106,681,204],{"class":131},[106,683,685],{"class":108,"line":684},18,[106,686,301],{"emptyLinePlaceholder":300},[106,688,690,693,695],{"class":108,"line":689},19,[106,691,692],{"class":119},"  return",[106,694,475],{"class":154},[106,696,204],{"class":131},[106,698,700],{"class":108,"line":699},20,[106,701,220],{"class":131},[48,703,705],{"id":704},"auswertung-in-chrome-devtools","Auswertung in Chrome DevTools:",[707,708,709,715,726,735,742],"ol",{},[63,710,711,712,158],{},"Öffne im Chrome-Browser ",[25,713,714],{},"chrome:\u002F\u002Finspect",[63,716,717,718,722,723,158],{},"Klicke auf ",[719,720,721],"strong",{},"\"Open dedicated DevTools for Node\""," oder gehe in den Tab ",[719,724,725],{},"Memory",[63,727,717,728,731,732,734],{},[719,729,730],{},"Load"," und wähle die generierte ",[25,733,531],{},"-Datei aus.",[63,736,737,738,741],{},"Sortiere nach ",[719,739,740],{},"Retained Size"," (Speichergröße inklusive aller abhängigen Referenzen).",[63,743,744,745,748,749,752,753,158],{},"Halte Ausschau nach Instanzen von ",[25,746,747],{},"Message",", ",[25,750,751],{},"GuildMember"," oder ",[25,754,755],{},"Closure",[37,757],{},[40,759,761],{"id":760},"_3-best-practice-benutzerdefinierte-cache-manager-sweeper","3. Best Practice: Benutzerdefinierte Cache-Manager & Sweeper",[21,763,764,765,767],{},"In modernen Produktionsumgebungen begrenzen wir die Caches von ",[25,766,57],{}," rigoros über die Client-Optionen:",[98,769,771],{"className":100,"code":770,"language":102,"meta":7,"style":7},"import { Client, GatewayIntentBits, Options } from 'discord.js';\n\nexport const botClient = new Client({\n  intents: [\n    GatewayIntentBits.Guilds,\n    GatewayIntentBits.GuildMessages,\n    GatewayIntentBits.MessageContent,\n  ],\n  makeCache: Options.cacheWithLimits({\n    \u002F\u002F Nachrichten nur bis zu 25 Stück pro Kanal cachen\n    MessageManager: 25,\n    \u002F\u002F Präsenzen und Aktivitäten komplett deaktivieren\n    PresenceManager: 0,\n    \u002F\u002F Reaktionen nicht im Speicher vorhalten\n    ReactionManager: 0,\n    \u002F\u002F User-Profile auf maximale Lebensdauer begrenzen\n    UserManager: {\n      maxSize: 500,\n      keepOverLimit: (value) => value.id === client.user?.id,\n    },\n    \u002F\u002F Voice-States nur für aktive Kanäle\n    VoiceStateManager: 100,\n  }),\n  sweepers: {\n    \u002F\u002F Automatisches Bereinigen alle 30 Minuten\n    ...Options.defaultSweeperSettings,\n    messages: {\n      interval: 1800, \u002F\u002F 30 Minuten\n      lifetime: 900,  \u002F\u002F Nachrichten älter als 15 Minuten entfernen\n    },\n    users: {\n      interval: 3600, \u002F\u002F 1 Stunde\n      filter: () => (user) => !user.bot, \u002F\u002F Nur inaktive Nicht-Bots verwerfen\n    },\n  },\n});\n",[25,772,773,806,810,833,843,856,867,878,885,903,908,920,925,937,942,953,958,967,979,1022,1027,1033,1046,1055,1065,1071,1087,1097,1113,1129,1134,1144,1159,1194,1199,1205],{"__ignoreMap":7},[106,774,775,777,780,782,784,787,789,792,795,798,800,802,804],{"class":108,"line":109},[106,776,243],{"class":119},[106,778,779],{"class":131}," {",[106,781,143],{"class":154},[106,783,176],{"class":131},[106,785,786],{"class":154}," GatewayIntentBits",[106,788,176],{"class":131},[106,790,791],{"class":154}," Options",[106,793,794],{"class":131}," }",[106,796,797],{"class":119}," from",[106,799,252],{"class":131},[106,801,57],{"class":170},[106,803,167],{"class":131},[106,805,204],{"class":131},[106,807,808],{"class":108,"line":116},[106,809,301],{"emptyLinePlaceholder":300},[106,811,812,814,817,820,823,826,828,830],{"class":108,"line":151},[106,813,120],{"class":119},[106,815,816],{"class":123}," const",[106,818,819],{"class":154}," botClient ",[106,821,822],{"class":131},"=",[106,824,825],{"class":131}," new",[106,827,143],{"class":127},[106,829,132],{"class":154},[106,831,832],{"class":131},"{\n",[106,834,835,838,840],{"class":108,"line":192},[106,836,837],{"class":164},"  intents",[106,839,139],{"class":131},[106,841,842],{"class":154}," [\n",[106,844,845,848,850,853],{"class":108,"line":207},[106,846,847],{"class":154},"    GatewayIntentBits",[106,849,158],{"class":131},[106,851,852],{"class":154},"Guilds",[106,854,855],{"class":131},",\n",[106,857,858,860,862,865],{"class":108,"line":217},[106,859,847],{"class":154},[106,861,158],{"class":131},[106,863,864],{"class":154},"GuildMessages",[106,866,855],{"class":131},[106,868,869,871,873,876],{"class":108,"line":363},[106,870,847],{"class":154},[106,872,158],{"class":131},[106,874,875],{"class":154},"MessageContent",[106,877,855],{"class":131},[106,879,880,883],{"class":108,"line":465},[106,881,882],{"class":154},"  ]",[106,884,855],{"class":131},[106,886,887,890,892,894,896,899,901],{"class":108,"line":470},[106,888,889],{"class":164},"  makeCache",[106,891,139],{"class":131},[106,893,791],{"class":154},[106,895,158],{"class":131},[106,897,898],{"class":127},"cacheWithLimits",[106,900,132],{"class":154},[106,902,832],{"class":131},[106,904,905],{"class":108,"line":540},[106,906,907],{"class":112},"    \u002F\u002F Nachrichten nur bis zu 25 Stück pro Kanal cachen\n",[106,909,910,913,915,918],{"class":108,"line":562},[106,911,912],{"class":164},"    MessageManager",[106,914,139],{"class":131},[106,916,917],{"class":396}," 25",[106,919,855],{"class":131},[106,921,922],{"class":108,"line":589},[106,923,924],{"class":112},"    \u002F\u002F Präsenzen und Aktivitäten komplett deaktivieren\n",[106,926,927,930,932,935],{"class":108,"line":594},[106,928,929],{"class":164},"    PresenceManager",[106,931,139],{"class":131},[106,933,934],{"class":396}," 0",[106,936,855],{"class":131},[106,938,939],{"class":108,"line":614},[106,940,941],{"class":112},"    \u002F\u002F Reaktionen nicht im Speicher vorhalten\n",[106,943,944,947,949,951],{"class":108,"line":619},[106,945,946],{"class":164},"    ReactionManager",[106,948,139],{"class":131},[106,950,934],{"class":396},[106,952,855],{"class":131},[106,954,955],{"class":108,"line":647},[106,956,957],{"class":112},"    \u002F\u002F User-Profile auf maximale Lebensdauer begrenzen\n",[106,959,960,963,965],{"class":108,"line":675},[106,961,962],{"class":164},"    UserManager",[106,964,139],{"class":131},[106,966,148],{"class":131},[106,968,969,972,974,977],{"class":108,"line":684},[106,970,971],{"class":164},"      maxSize",[106,973,139],{"class":131},[106,975,976],{"class":396}," 500",[106,978,855],{"class":131},[106,980,981,984,986,988,991,993,995,998,1000,1003,1006,1009,1011,1014,1017,1020],{"class":108,"line":689},[106,982,983],{"class":127},"      keepOverLimit",[106,985,139],{"class":131},[106,987,179],{"class":131},[106,989,990],{"class":135},"value",[106,992,69],{"class":131},[106,994,187],{"class":123},[106,996,997],{"class":154}," value",[106,999,158],{"class":131},[106,1001,1002],{"class":154},"id ",[106,1004,1005],{"class":131},"===",[106,1007,1008],{"class":154}," client",[106,1010,158],{"class":131},[106,1012,1013],{"class":154},"user",[106,1015,1016],{"class":131},"?.",[106,1018,1019],{"class":154},"id",[106,1021,855],{"class":131},[106,1023,1024],{"class":108,"line":699},[106,1025,1026],{"class":131},"    },\n",[106,1028,1030],{"class":108,"line":1029},21,[106,1031,1032],{"class":112},"    \u002F\u002F Voice-States nur für aktive Kanäle\n",[106,1034,1036,1039,1041,1044],{"class":108,"line":1035},22,[106,1037,1038],{"class":164},"    VoiceStateManager",[106,1040,139],{"class":131},[106,1042,1043],{"class":396}," 100",[106,1045,855],{"class":131},[106,1047,1049,1051,1053],{"class":108,"line":1048},23,[106,1050,210],{"class":131},[106,1052,69],{"class":154},[106,1054,855],{"class":131},[106,1056,1058,1061,1063],{"class":108,"line":1057},24,[106,1059,1060],{"class":164},"  sweepers",[106,1062,139],{"class":131},[106,1064,148],{"class":131},[106,1066,1068],{"class":108,"line":1067},25,[106,1069,1070],{"class":112},"    \u002F\u002F Automatisches Bereinigen alle 30 Minuten\n",[106,1072,1074,1077,1080,1082,1085],{"class":108,"line":1073},26,[106,1075,1076],{"class":131},"    ...",[106,1078,1079],{"class":154},"Options",[106,1081,158],{"class":131},[106,1083,1084],{"class":154},"defaultSweeperSettings",[106,1086,855],{"class":131},[106,1088,1090,1093,1095],{"class":108,"line":1089},27,[106,1091,1092],{"class":164},"    messages",[106,1094,139],{"class":131},[106,1096,148],{"class":131},[106,1098,1100,1103,1105,1108,1110],{"class":108,"line":1099},28,[106,1101,1102],{"class":164},"      interval",[106,1104,139],{"class":131},[106,1106,1107],{"class":396}," 1800",[106,1109,176],{"class":131},[106,1111,1112],{"class":112}," \u002F\u002F 30 Minuten\n",[106,1114,1116,1119,1121,1124,1126],{"class":108,"line":1115},29,[106,1117,1118],{"class":164},"      lifetime",[106,1120,139],{"class":131},[106,1122,1123],{"class":396}," 900",[106,1125,176],{"class":131},[106,1127,1128],{"class":112},"  \u002F\u002F Nachrichten älter als 15 Minuten entfernen\n",[106,1130,1132],{"class":108,"line":1131},30,[106,1133,1026],{"class":131},[106,1135,1137,1140,1142],{"class":108,"line":1136},31,[106,1138,1139],{"class":164},"    users",[106,1141,139],{"class":131},[106,1143,148],{"class":131},[106,1145,1147,1149,1151,1154,1156],{"class":108,"line":1146},32,[106,1148,1102],{"class":164},[106,1150,139],{"class":131},[106,1152,1153],{"class":396}," 3600",[106,1155,176],{"class":131},[106,1157,1158],{"class":112}," \u002F\u002F 1 Stunde\n",[106,1160,1162,1165,1167,1169,1171,1173,1175,1177,1179,1182,1184,1186,1189,1191],{"class":108,"line":1161},33,[106,1163,1164],{"class":127},"      filter",[106,1166,139],{"class":131},[106,1168,640],{"class":131},[106,1170,187],{"class":123},[106,1172,179],{"class":131},[106,1174,1013],{"class":135},[106,1176,69],{"class":131},[106,1178,187],{"class":123},[106,1180,1181],{"class":131}," !",[106,1183,1013],{"class":154},[106,1185,158],{"class":131},[106,1187,1188],{"class":154},"bot",[106,1190,176],{"class":131},[106,1192,1193],{"class":112}," \u002F\u002F Nur inaktive Nicht-Bots verwerfen\n",[106,1195,1197],{"class":108,"line":1196},34,[106,1198,1026],{"class":131},[106,1200,1202],{"class":108,"line":1201},35,[106,1203,1204],{"class":131},"  },\n",[106,1206,1208,1210,1212],{"class":108,"line":1207},36,[106,1209,419],{"class":131},[106,1211,69],{"class":154},[106,1213,204],{"class":131},[37,1215],{},[40,1217,1219],{"id":1218},"_4-schwache-referenzen-mit-weakmap-und-weakset","4. Schwache Referenzen mit WeakMap und WeakSet",[21,1221,1222,1223,1226,1227,1230],{},"Wenn dein Bot temporäre Metadaten zu Nachrichten oder Interaktionen speichern muss, nutze ",[25,1224,1225],{},"WeakMap"," anstelle von regulären ",[25,1228,1229],{},"Map","-Objekten:",[98,1232,1234],{"className":100,"code":1233,"language":102,"meta":7,"style":7},"\u002F\u002F RICHTIG: Der Garbage Collector kann Message-Objekte abräumen,\n\u002F\u002F sobald sie von discord.js verworfen werden!\nexport const userCooldowns = new WeakMap\u003CMessage, number>();\n\nexport function registerCooldown(message: Message, durationMs: number) {\n  userCooldowns.set(message, Date.now() + durationMs);\n}\n",[25,1235,1236,1241,1246,1279,1283,1314,1349],{"__ignoreMap":7},[106,1237,1238],{"class":108,"line":109},[106,1239,1240],{"class":112},"\u002F\u002F RICHTIG: Der Garbage Collector kann Message-Objekte abräumen,\n",[106,1242,1243],{"class":108,"line":116},[106,1244,1245],{"class":112},"\u002F\u002F sobald sie von discord.js verworfen werden!\n",[106,1247,1248,1250,1252,1255,1257,1259,1262,1265,1267,1269,1272,1275,1277],{"class":108,"line":151},[106,1249,120],{"class":119},[106,1251,816],{"class":123},[106,1253,1254],{"class":154}," userCooldowns ",[106,1256,822],{"class":131},[106,1258,825],{"class":131},[106,1260,1261],{"class":127}," WeakMap",[106,1263,1264],{"class":131},"\u003C",[106,1266,747],{"class":142},[106,1268,176],{"class":131},[106,1270,1271],{"class":142}," number",[106,1273,1274],{"class":131},">",[106,1276,358],{"class":154},[106,1278,204],{"class":131},[106,1280,1281],{"class":108,"line":192},[106,1282,301],{"emptyLinePlaceholder":300},[106,1284,1285,1287,1289,1292,1294,1296,1298,1301,1303,1306,1308,1310,1312],{"class":108,"line":207},[106,1286,120],{"class":119},[106,1288,124],{"class":123},[106,1290,1291],{"class":127}," registerCooldown",[106,1293,132],{"class":131},[106,1295,182],{"class":135},[106,1297,139],{"class":131},[106,1299,1300],{"class":142}," Message",[106,1302,176],{"class":131},[106,1304,1305],{"class":135}," durationMs",[106,1307,139],{"class":131},[106,1309,1271],{"class":142},[106,1311,69],{"class":131},[106,1313,148],{"class":131},[106,1315,1316,1319,1321,1324,1326,1328,1330,1333,1335,1337,1340,1343,1345,1347],{"class":108,"line":217},[106,1317,1318],{"class":154},"  userCooldowns",[106,1320,158],{"class":131},[106,1322,1323],{"class":127},"set",[106,1325,132],{"class":164},[106,1327,182],{"class":154},[106,1329,176],{"class":131},[106,1331,1332],{"class":154}," Date",[106,1334,158],{"class":131},[106,1336,524],{"class":127},[106,1338,1339],{"class":164},"() ",[106,1341,1342],{"class":131},"+",[106,1344,1305],{"class":154},[106,1346,69],{"class":164},[106,1348,204],{"class":131},[106,1350,1351],{"class":108,"line":363},[106,1352,220],{"class":131},[21,1354,1355,1356,1358],{},"Mit ",[25,1357,1225],{}," verhindert der Key nicht, dass das Originalobjekt freigegeben wird. Sobald der Message-Cache geleert wird, verschwindet der Eintrag automatisch aus dem Speicher.",[37,1360],{},[40,1362,1364],{"id":1363},"_5-zusammenfassung-checkliste-für-247-uptime","5. Zusammenfassung & Checkliste für 24\u002F7 Uptime",[1366,1367,1368,1384],"table",{},[1369,1370,1371],"thead",{},[1372,1373,1374,1378,1381],"tr",{},[1375,1376,1377],"th",{},"Maßnahme",[1375,1379,1380],{},"Empfohlener Wert",[1375,1382,1383],{},"Wirkung",[1385,1386,1387,1402,1413,1424,1439],"tbody",{},[1372,1388,1389,1396,1399],{},[1390,1391,1392,1395],"td",{},[25,1393,1394],{},"MessageManager"," Cache-Limit",[1390,1397,1398],{},"10–50 pro Kanal",[1390,1400,1401],{},"Verhindert lineares RAM-Wachstum bei Chat-Aktivität",[1372,1403,1404,1407,1410],{},[1390,1405,1406],{},"Message Sweeper Intervall",[1390,1408,1409],{},"1800 s (30 Min)",[1390,1411,1412],{},"Entfernt alte Nachrichten zuverlässig aus dem Heap",[1372,1414,1415,1418,1421],{},[1390,1416,1417],{},"Presence Cache",[1390,1419,1420],{},"0 (Deaktiviert)",[1390,1422,1423],{},"Spart bis zu 70 % Speicher auf großen Community-Servern",[1372,1425,1426,1429,1436],{},[1390,1427,1428],{},"Event-Listener Deregistrierung",[1390,1430,1431,1432,1435],{},"Immer ",[25,1433,1434],{},"client.off()"," bei Modul-Reload",[1390,1437,1438],{},"Verhindert Closure-Leaks im Root-Scope",[1372,1440,1441,1444,1449],{},[1390,1442,1443],{},"V8 Heap Limit",[1390,1445,1446],{},[25,1447,1448],{},"--max-old-space-size=512",[1390,1450,1451],{},"Zwingt Node.js zu früherer Garbage Collection",[1453,1454,1455],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":7,"searchDepth":116,"depth":116,"links":1457},[1458,1462,1465,1466,1467],{"id":42,"depth":116,"text":43,"children":1459},[1460,1461],{"id":50,"depth":151,"text":51},{"id":84,"depth":151,"text":85},{"id":225,"depth":116,"text":226,"children":1463},[1464],{"id":704,"depth":151,"text":705},{"id":760,"depth":116,"text":761},{"id":1218,"depth":116,"text":1219},{"id":1363,"depth":116,"text":1364},"Discord-Bots, die auf großen Servern betrieben werden oder über Wochen ohne Neustart laufen, leiden häufig unter schleichendem RAM-Wachstum. Ein Bot, der nach dem Start 120 MB Arbeitsspeicher belegt, kann innerhalb weniger Tage mehrere Gigabyte verbrauchen, bis die Node.js-Runtime den Prozess mit einem FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory beendet.","md",{},0,"\u002Fdocs\u002Fde\u002Fdiscord-memory-leaks",{"title":1474,"description":1468},{"Discord":1475,"description":1477,"category":1478,"order":109,"author":1479,"readTime":1480,"lastUpdated":1481},{"js Memory Leaks beheben":1476},"V8 Heap-Analyse & Cache-Strategien","Praxisleitfaden zur Erkennung und Behebung von Speicherlecks in 24\u002F7 Discord-Bots mit Node.js, V8 Heap-Snapshots und optimiertem Cache-Sweeping.","engineering","Luca Lichtenwald","12 min","2026-10-09","docs\u002Fde\u002Fdiscord-memory-leaks","9OzYllcPtf4hcndxf_irIltNqeOO3ES3yg_WrlwIeXo",{"enabled":300,"clientPubId":1485,"docsSlotId":7,"newsSlotId":7,"guidesSlotId":7,"dashboardSlotId":7,"docsEnabled":300,"newsEnabled":300,"guidesEnabled":300,"dashboardEnabled":300},"ca-pub-9454065621077312"]