Lua Academy · Oppitunti

Muistivuotojen välttäminen

Tutkikaa Luan yleisiä muistivuotokuvioita ja keinoja niiden ehkäisemiseen.

Oppitunti 4/413 vaihetta

Muistivuotojen välttäminen on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on muistivuoto Luassa?

Muistivuoto syntyy, kun oliot kertyvät muistiin, koska viite estää GC:tä keräämästä niitä, vaikka ohjelma ei enää tarvitse niitä.

Yleinen vuoto: globaali kertyminen

Olioiden tallentaminen globaaliin taulukkoon poistamatta niitä on klassinen vuoto. Globaali taulukko on aina GC-juuri.

local cache = {}  -- global-like upvalue
function storeResult(key, val)
  cache[key] = val  -- never evicted!
end

Korjaus: rajattu välimuisti

Rajoittakaa välimuistin kokoa ja poistakaa vanhoja merkintöjä LRU-strategialla tai yksinkertaisella kokorajalla.

local MAX = 100
local function boundedStore(cache, key, val)
  if #cache >= MAX then
    table.remove(cache, 1)  -- evict oldest
  end
  cache[key] = val
end

Yleinen vuoto: tapahtumankuuntelijat

Sulkemisen rekisteröiminen tapahtumankuuntelijaksi ja sen rekisteröinnin peruuttamatta jättäminen pitää sekä sulkemisen että sen upvalues-muuttujat elossa.

local listeners = {}
function on(event, fn)
  listeners[event] = listeners[event] or {}
  listeners[event][#listeners[event]+1] = fn
end
-- Always provide off() to deregister!

Korjaus: heikot kuuntelijataulukot

Tallentakaa kuuntelijat heikkoon arvo-taulukkoon, jotta kuuntelijaolion kerääminen poistaa sen kuuntelijan automaattisesti.

local listeners = setmetatable({}, {__mode = "v"})

Yleinen vuoto: suuria taulukoita kaappaavat sulkemiset

Suurta taulukkoa kaappaava sulkeminen pitää taulukon elossa niin kauan kuin sulkeminen on olemassa, vaikka tarvittaisiin vain pieni osa taulukosta.

local bigData = {-- 100MB of data --}
local fn = function()
  return bigData[1]  -- bigData stays alive!
end

Korjaus: poimikaa tarvittavat arvot

Poimikaa vain tarvittavat arvot ennen sulkemisen luomista, jotta suuri taulukko voidaan kerätä.

local needed = bigData[1]
bigData = nil  -- allow collection
local fn = function() return needed end

Coroutine-vuodot

Keskeytetty coroutine on elossa ja pitää kaikki paikalliset muuttujansa varattuina. Kuolleet coroutinet (tila "dead") voidaan kerätä. Älkää koskaan kadottako keskeytettyjen coroutinejen seurantaa.

Merkkijonojen kertyminen

Merkkijonojen yhdistäminen silmukassa operaattorilla .. luo paljon väliaikaisia merkkijonoja. Käyttäkää table.concat-funktiota suurten merkkijonojen tehokkaaseen muodostamiseen.

local parts = {}
for i = 1, 1000 do parts[i] = tostring(i) end
local result = table.concat(parts, ",")

Vuotojen vianmääritys

Käyttäkää collectgarbage("count")-funktiota ennen toimintoja ja niiden jälkeen muistin kasvun mittaamiseen. Kirjatkaa epäilyttävä kasvu lokiin vuodon lähteen rajaamiseksi.

local before = collectgarbage("count")
-- ... run operation ...
collectgarbage()
local after = collectgarbage("count")
print(("Delta: %.1f KB"):format(after - before))

Profilointityökalut

luamemprof-työkalun ja mukautettujen debug.sethook-varauslaskureiden kaltaiset työkalut voivat seurata, mitkä koodipolut varaavat eniten muistia.

Muistivuotoa koskeva kysymys

Mikä toimintamalli aiheuttaa todennäköisimmin muistivuodon?

Kertaus: muistivuotojen välttäminen

Luan vuodot johtuvat rajoittamattomista välimuisteista, rekisteröinnin peruuttamatta jätetyistä kuuntelijoista, suuria taulukoita käsittelevistä sulkemisista ja unohdetuista keskeytetyistä coroutineista. Käyttäkää heikkoja taulukoita ja rajattuja välimuisteja sekä collectgarbage("count")-funktiota vuotojen havaitsemiseen ja estämiseen.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Muistivuotojen välttäminen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Muistivuotojen välttäminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Muistivuotojen välttäminen”?

Tutkikaa Luan yleisiä muistivuotokuvioita ja keinoja niiden ehkäisemiseen. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Muistivuotojen välttäminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Luan roskankeräyksen perusteet
  2. Heikot avaimet ja arvot
  3. Lopettajat __gc:llä
  4. Muistivuotojen välttäminen
← Takaisin: Lua Academy