Ghostty memória szivárgás: mi okozta és hogyan javították?

jan 11, 2026

Nemrégiben több Ghostty felhasználó is arra panaszkodott, hogy az alkalmazás elképesztő mennyiségű memóriát zabál fel – egyeseknél akár 37 GB-ot is elfogyasztott mindössze 10 nap alatt. Ez engem is meglepett, hiszen egy termináltól ilyesmi nem várható. A jó hír viszont az, hogy a fejlesztők megtalálták a hibát, és már be is építették a javítást. Ebben a cikkben végigvezetlek azon, hogy pontosan mi okozta ezt a memóriaszivárgást, hogyan működik a Ghostty belső memóriakezelése, és milyen lépésekkel sikerült végül elcsípni ezt a makacs problémát.

Miért volt ilyen nehéz megtalálni a hibát?

A memória szivárgás már legalább a Ghostty 1.0 verziója óta jelen volt, de csak mostanában vált igazán látványossá. Ennek az az oka, hogy csak néhány népszerű parancssori alkalmazás – különösen a Claude Code – kezdett olyan körülményeket teremteni, amelyek nagy mennyiségben előhozták ezt a hibát. Ez a speciális körülményrendszer tette igazán trükkössé a probléma diagnosztizálását.

A javítás már elérhető az éjszakai (nightly) kiadásokban, és várhatóan a márciusban érkező 1.3-as verzióban is benne lesz.

A PageList: így kezeli Ghostty a terminál tartalmát

Ahhoz, hogy megértsük a hibát, először azt kell tudnunk, hogyan tárolja Ghostty a terminál tartalmát. Ehhez egy PageList nevű adatszerkezetet használ, ami egy kétszeresen láncolt lista (doubly-linked list) memóriaoldalakból (memory pages) áll. Ezek az oldalak tárolják magát a terminál tartalmat: karaktereket, stílusokat, linkeket és minden mást.

Fontos tisztázni, hogy ezek az “oldalak” nem egyszerű virtuális memóriaoldalak – hanem olyan összefüggő memóriablokkok, amelyek rendszeroldal méretre vannak igazítva és több rendszeroldalból állnak össze.

Kétféle oldal allokáció létezik:

  • Standard oldalak: Ezek fix méretűek, egy memóriapoolból kerülnek kiadásra és oda is visszaadják őket újrafelhasználásra.
  • Nem-standard oldalak: Ezek változó méretűek (általában nagyobbak), közvetlenül mmap-pel vannak lefoglalva és felszabadításukhoz munmap hívás szükséges – nem kerülnek vissza a poolba.

A pool használata azért fontos, mert az mmap hívások lassúak lehetnek; így ha van lehetőség újrahasznosítani egy már lefoglalt oldalt, az jelentős teljesítményelőnyt jelent.

A scrollback pruning – avagy hogyan takarítja ki Ghostty a régi tartalmat

A terminálokban megszokott funkció, hogy korlátozzák mennyi előzményt (scrollback history) tárolnak. Ghostty-ban van egy beállítás erre: ha eléri ezt a limitet, akkor elkezdi törölni a legrégebbi oldalakat.

Egy fontos optimalizáció viszont itt jön képbe: amikor eléri ezt a limitet, nem dobja ki azonnal az első oldalt és kér új memóriát hátulra – hanem egyszerűen áthelyezi ezt az első oldalt a lista végére és “kitakarítja” (metadata szinten), így újra felhasználja azt. Ez drasztikusan csökkenti az allokációk számát és gyorsabbá teszi az egész folyamatot.

A hiba gyökere: metadata és valós memória szinkronizációjának hiánya

Itt jön be az egész sztori lényege: amikor újrahasznosították ezt az oldalt scrollback pruning során, mindig visszaállították annak méretét standard méretre metadata szinten – de nem változtatták meg ténylegesen az alatta lévő memóriafoglalást! Így előfordult, hogy egy valójában nagyobb (nem-standard) oldal úgy lett kezelve mint egy standard méretű oldal.

Amikor később felszabadították ezeket az oldalakat (például amikor bezárták a terminált), akkor mivel metadata szerint standard méretűnek tűntek, visszaadták őket csak simán a poolnak – de nem hívták meg rájuk azt az erőforrás-felszabadító függvényt (munmap), ami ténylegesen felszabadítaná az operációs rendszer számára lefoglalt memóriát. Így ezeket az óriási memóriablokkokat soha nem engedték el – klasszikus memória szivárgás történt.

Hogyan néz ki ez lépésekben?

  1. Lefoglal egy nem-standard méretű oldalt (pl. sok emoji vagy link miatt).
  2. A scrollback pruning újrahasznosítja ezt az oldalt: metadata szerint visszaállítja standard méretre.
  3. Később felszabadításkor úgy kezeli mint standard oldalt és nem hívja meg rá a munmap-et.
  4. A nagy memória soha nem szabadul fel – így nő folyamatosan a fogyasztás.

Miért pont most lett ez probléma?

A kulcs itt Claude Code nevű CLI alkalmazás megjelenése volt. Ez ugyanis rengeteg olyan kimenetet generál, ami sok többkódpontú karakterből álló grapheme-t tartalmaz – emiatt gyakran kényszeríti Ghostty-t arra, hogy ne-standard méretű oldalakat használjon. Ráadásul Claude Code sok scrollback tartalmat is generál egyszerre. Ez együtt olyan helyzetet teremtett, ahol ez a régóta meglévő hiba tömegesen aktiválódott.

Szeretném hangsúlyozni: ez nem Claude Code hibája! Ő csak olyan helyzetbe hozta Ghostty-t, ami eddig rejtve maradt.

A megoldás: soha ne használd újra nem-standard oldalakat

A javítás egyszerű: ha scrollback pruning során találkozunk nem-standard méretű oldallal, akkor azt rendesen felszabadítjuk (munmap), majd újat kérünk standard méretben a poolból. Így biztosan nem marad bent fölösleges nagy memóriafoglalás.

if(first.data.memory.len > std_size){
    self.destroyNode(first);
    break prune;
}

Bár lehetett volna bonyolultabb stratégiákat is alkalmazni (például mérni milyen gyakran fordulnak elő nem-standard oldalak és ehhez igazítani az optimalizációkat), jelenleg ez az egyszerű megoldás illeszkedik legjobban Ghostty eredeti elképzeléseihez és stabilan működik.

További fejlesztések: macOS virtuális memória címkék

A javítás részeként bekerült támogatás macOS-en speciális virtuális memória címkékhez (VM tags), amit a Mach kernel biztosít. Ez lehetővé teszi, hogy amikor memóriát foglalunk PageList számára, akkor azt külön címkével lássuk el – így könnyebb volt megtalálni és követni ezt a memóriaszivárgást különböző eszközökkel.

inline fn pageAllocator() Allocator {
    if(builtin.is_test) return std.testing.allocator;
    if(!builtin.target.os.tag.isDarwin()) return std.heap.page_allocator;
    const mach = @import("../os/mach.zig");
    return mach.taggedPageAllocator(.application_specific_1);
}

Ezzel sokkal átláthatóbbá váltak a memóriakezelési folyamatok macOS alatt is.

Hogyan próbálják megelőzni hasonló hibákat?

  • Debug build-ekben speciális leak-detektáló Zig allokátorokat használnak.
  • Minden commit után futtatják Valgrind-et unit teszteken keresztül, hogy ne csak szivárgást hanem más memóriakezelési problémákat is kiszúrjanak.
  • macOS GUI esetén Instruments eszközzel keresik aktívan a Swift kódlefedettség alatti szivárgásokat.
  • Minden GTK-hoz kapcsolódó pull requestet Valgrind-del ellenőriznek GUI szinten is.

Bár ezekkel eddig jól mentek dolgok, ez a konkrét hiba pont azért csúszott át rajtuk mert nagyon speciális körülmények között jelentkezett – amiket korábban nem sikerült reprodukálni teszteken belül. A mostani javítás része egy reprodukciós teszt is lett, ami segít megelőzni hasonló regressziókat később.

Zárszó

Eddig ez volt Ghostty legnagyobb ismert memóriaszivárgása és az egyetlen olyan hiba is egyben, amit több felhasználó is megerősített. A fejlesztők továbbra is figyelik majd az esetleges újabb memóriajelentéseket és igyekeznek gyorsan reagálni rájuk. Az ilyen hibák kapcsán mindig kulcsfontosságú tudni reprodukálni őket – csak így lehet hatékonyan orvosolni őket!

Nagy köszönet @grishy-nak, aki végül megbízható reprodukciót adott ehhez az ügyhöz – így önállóan is elemezhettem és ellenőrizhettem mindent. Az ő elemzésük ugyanarra jutott mint én; együtt pedig biztosak lehettünk abban, hogy jó irányba haladunk.
Köszönet jár azoknak is akik részletes diagnosztikai adatokat küldtek be! A közösség által gyűjtött információk – például footprint output vagy VM régió számlálások – nagyon fontos nyomokat adtak ahhoz, hogy végül megtaláljuk bűnöst: magát a PageList-et.

Forrás: https://mitchellh.com/writing/ghostty-memory-leak-fix

2025-ben először fél évszázad alatt egyszerre csökkent a szénalapú áramtermelés Kínában és Indiában

Ha azt mondom, hogy Kína és India 2025-ben egyszerre csökkentette a szénalapú áramtermelését, talán elsőre nem tűnik túl nagy dolognak. Pedig ez az első ilyen egyidejű visszaesés az elmúlt 50 évben – egészen pontosan 1973 óta nem volt példa rá. És ha belegondolsz,...

Tajvan átvette Dél-Koreát: a világ legalacsonyabb születési aránya

Nemrégiben megjelent kormányzati adatok szerint Tajvan megelőzte Dél-Koreát, és mostantól a világ legalacsonyabb születési arányával büszkélkedhet. Ez a hír nem csak statisztikai érdekesség, hanem egy olyan jelenség része, amely komoly következményekkel jár a...

Miért buknak el a startupok? A „rossz időzítés” mítosza és a valós okok

Ha már egy ideje mozogsz a tech világban, biztosan találkoztál a CB Insights híres listájával, amely a startupok bukásának okait sorolja fel. Ez az összeállítás szinte kötelező olvasmány lett az inkubátorprogramok első prezentációiban, hogy figyelmeztesse az...

Jimmy Kimmel kifigurázta Donald Trumpot: a világ legdühösebb telemarketingese

Nem újdonság, hogy Donald Trump nem rejti véka alá az indulatait, amikor nem úgy alakulnak a dolgok, ahogy ő szeretné. De hogy egy komikus ilyen frappánsan fogalmazza meg a helyzetet, az azért ritka. Jimmy Kimmel a hétfő esti Jimmy Kimmel Live! monológjában úgy...

Tommy Habeeb és a Cheaters forgatásának legveszélyesebb pillanatai – a valóságshow, ami több volt, mint szórakoztatás

Ha valaha is kíváncsi voltál arra, milyen lehet egy olyan műsor házigazdájának lenni, ahol a hűtlenség leleplezése közben bármikor elszabadulhat a pokol, akkor Tommy Habeeb történetei garantáltan lekötnek majd. A 67 éves televíziós sztár, aki a Cheaters című...

Kína és India történelmi lépése: csökken a szénalapú áramtermelés 2025-ben

Elképesztő fordulatot hozott az elmúlt év az energiapiacon: 2025-ben először több mint ötven év után Kínában és Indiában is csökkent a szénalapú áramtermelés. Ez a változás nemcsak szakmai körökben keltett hullámokat, hanem globális jelentőséggel bír, hiszen a világ...

Ofcom vizsgálatot indított Elon Musk X platformja ellen a Grok AI szexuális deepfake képek miatt

Nem mindennapi helyzet alakult ki az Egyesült Királyságban: az ország kommunikációs szabályozó hatósága, az Ofcom, hivatalos vizsgálatot indított Elon Musk X nevű közösségi média platformja ellen. Az ok? A platformon elérhető Grok AI nevű mesterséges intelligencia...

Tiiny AI Pocket Lab: A világ legkisebb AI szuperszámítógépe a CES 2026-on

Nem meglepő, hogy az idei CES-en az mesterséges intelligencia mindenhol ott van – főleg hordható eszközök formájában. De ami igazán felkeltette a figyelmemet, az nem egy okosóra vagy fitnesz karkötő volt, hanem egy olyan aprócska számítógép, ami simán elfér a...

Miért késett a 16-bites CP/M, és hogyan alakította át a számítástechnika történetét?

Ha azt hiszed, hogy a PC-s operációs rendszerek története egyszerűen csak az IBM és Microsoft nagy dobásairól szól, akkor készülj fel egy meglepetésre! A 16-bites CP/M operációs rendszer késése ugyanis nem csupán egy apró technikai csúszás volt, hanem az egész...

Miért buktak el a McDonald’s és Coca-Cola AI-generált karácsonyi reklámjai? – Kreativitás vagy gépies munka?

Nemrégiben két óriáscég, a McDonald’s és a Coca-Cola is belevágott az AI-alapú reklámgyártásba, de az eredmény messze elmaradt a várakozásoktól. A McDonald’s novemberben egy „The Worst Time of the Year” (Az év legrosszabb időszaka) című karácsonyi reklámmal...