Speicherlecks vermeiden
Lernen Sie häufige Muster für Speicherlecks in Lua und Strategien zu ihrer Vermeidung kennen
Speicherlecks vermeiden ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist ein Memory Leak in Lua?
Ein Memory Leak tritt auf, wenn sich Objekte im Speicher ansammeln, weil eine Referenz verhindert, dass der GC sie einsammelt, obwohl das Programm sie nicht mehr benötigt.
Häufiges Leak: Globale Ansammlung
Objekte in einer globalen Tabelle zu speichern, ohne sie zu entfernen, ist ein klassisches Leak. Die globale Tabelle ist immer eine GC-Wurzel.
local cache = {} -- global-like upvalue
function storeResult(key, val)
cache[key] = val -- never evicted!
endBehebung: Begrenzter Cache
Begrenzen Sie die Cache-Größe und entfernen Sie alte Einträge mithilfe einer LRU-Strategie oder einer einfachen Größenbegrenzung.
local MAX = 100
local function boundedStore(cache, key, val)
if #cache >= MAX then
table.remove(cache, 1) -- evict oldest
end
cache[key] = val
endHäufiges Leak: Event-Listener
Wenn Sie eine Closure als Event-Listener registrieren und sie nie deregistrieren, bleiben sowohl die Closure als auch ihre Upvalues erhalten.
local listeners = {}
function on(event, fn)
listeners[event] = listeners[event] or {}
listeners[event][#listeners[event]+1] = fn
end
-- Always provide off() to deregister!Behebung: Schwache Listener-Tabellen
Speichern Sie Listener in einer Tabelle mit schwachen Werten. Wenn das Subscriber-Objekt eingesammelt wird, wird sein Listener automatisch entfernt.
local listeners = setmetatable({}, {__mode = "v"})Häufiges Leak: Closures mit großen Tabellen
Eine Closure, die eine große Tabelle erfasst, hält diese so lange am Leben, wie die Closure existiert, selbst wenn nur ein kleiner Teil der Tabelle benötigt wird.
local bigData = {-- 100MB of data --}
local fn = function()
return bigData[1] -- bigData stays alive!
endBehebung: Benötigte Werte extrahieren
Extrahieren Sie nur die benötigten Werte, bevor Sie die Closure erstellen, damit die große Tabelle eingesammelt werden kann.
local needed = bigData[1]
bigData = nil -- allow collection
local fn = function() return needed endCoroutine-Leaks
Eine angehaltene Coroutine ist aktiv und hält alle ihre lokalen Variablen fest. Beendete Coroutines (Status "dead") können eingesammelt werden. Verlieren Sie angehaltene Coroutines niemals aus dem Blick.
String-Ansammlung
Das Verketten von Strings in einer Schleife mit .. erzeugt viele Zwischen-Strings. Verwenden Sie table.concat, um große Strings effizient aufzubauen.
local parts = {}
for i = 1, 1000 do parts[i] = tostring(i) end
local result = table.concat(parts, ",")Leaks debuggen
Verwenden Sie collectgarbage("count") vor und nach Operationen, um das Speicherwachstum zu messen. Protokollieren Sie verdächtiges Wachstum, um die Quelle des Leaks einzugrenzen.
local before = collectgarbage("count")
-- ... run operation ...
collectgarbage()
local after = collectgarbage("count")
print(("Delta: %.1f KB"):format(after - before))Profiling-Tools
Tools wie luamemprof und benutzerdefinierte Allokationszähler mit debug.sethook können verfolgen, welche Codepfade den meisten Speicher allokieren.
Frage zu Memory Leaks
Welches Muster verursacht am wahrscheinlichsten ein Memory Leak?
Zusammenfassung: Memory Leaks vermeiden
Leaks in Lua entstehen durch unbegrenzte Caches, nicht deregistrierte Listener, Closures über großen Tabellen und vergessene angehaltene Coroutines. Verwenden Sie schwache Tabellen, begrenzte Caches und collectgarbage("count"), um Leaks zu erkennen und zu verhindern.
Häufig gestellte Fragen
Ist die Lektion „Speicherlecks vermeiden“ kostenlos?
Ja — der vollständige Text von „Speicherlecks vermeiden“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Speicherlecks vermeiden“?
Lernen Sie häufige Muster für Speicherlecks in Lua und Strategien zu ihrer Vermeidung kennen Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Speicherlecks vermeiden“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Grundlagen des Lua-Garbage-Collectors
- Schwache Schlüssel und schwache Werte
- Finalizer mit __gc
- Speicherlecks vermeiden