( _Franko_ | 2024. 05. 05., v – 19:01 )

Én itt önellentmondást érzek.

Nincs önellentmondás.

A funkcionálisan felszabadítható területet azért nevezzük funkcionálisan felszabadíthatónak, mert biztosan nem olvasunk rá többet. Amire még ráolvashatunk, az nem szabadítható fel.

Próbáld megérteni a példát.

A láncolt listás példád nem leak, hanem csupán egy szuboptimális memóriastruktúra, hiszen kell a lánc összes tagja, valamikor, valahova fel fogja használni.

Hogyne lenne leak, végtelenségig növekszik a memóriaigénye a processznek, az maga a memory leak. A memory leak független attól, hogy használod-e később vagy sem. A memory leak lényege az, hogy a processz memóriaigénye korlát nélkül növekszik, nem tudsz annyi memóriát adni, ami tetszőleges ideig determinisztikusan elég lesz.

Az, hogy emellett az új elem végére rakásához neki végig kell gyalogolnia a listán, az csak sima programozói balfaszság.

Az összes leak programozói balfaszság.

Szóval maradva a példádnál, van egy lánc amit mindig fel kell olvasni, mert csak. Oké. Ez milyen perfomancia vesztéssel jár?

Be kell olvasni swap-ról memóriába, ahhoz ki kell tenni mást swap-re, hogy legyen hely, aztán ha végigolvastad, hozzáfűzöl a végére egy új elemet, aztán ha jön egy másik process, aminek kell a swap-en ülő cucca, akkor ez megy ki mind swap-ra és jön be onnan más. Hogy a lófaszba ne lenne ez performancia veszteség?

De ez egy nagyon kisarkított példa, amit szerintem te is tudsz, hiszen írod, hogy "Ha ezt rendszeresen kiteszed swap-re, akkor percenként latency vesztésed lesz, ha nem teszed ki swap-re, akkor meg más aktív dolog fog kikerülni és felváltva latency problémáid lesznek.". Namármost amit percenként használsz, az soha nem lapozódik ki, kivéve, ha nincs elég memória a gépben.

Nem kisarkított példa, a leggyakoribb memory leak, amit írtam, hogy egy láncolt listában ott ülnek az adatok, amire nincs már szükség, de a lista sajátosságai miatt ott lesznek és aktívan lesznek használva. Hogyne lapozódna ki, ha van egy folyamatosan futó processzed és ez, meg kevés memóriád, akkor minden egyes percben a géped azzal fog foglalkozni, hogy kirak a swap-re mondjuk 1 GB adatot, beolvas 1 GB adatot, majd újra kiír 1 GB adatot és beolvas 1 GB adatot. Percenként. Teljesen feleslegesen.

A sima leak szerintem sokkal gyakoribb dolog (fun fact: google: "java leaking" 26 millió találat) mert ez ugye akkor van, amikor egy függvényben van egy malloc/new amin valamit csinál a függvény, majd a végén valamit ellenőriz, és például ha jó az érték akkor kibányássza a lefoglalt memóriából amire szüksége van, jön a free, és visszatér az eredménnyel, viszont ha az ellenőrzés során valami nem jó, akkor visszatér egy konstans hiba értékkel, és mivel ehhez már nem kell a lefoglalt memóriához nyúlni, a programozó simán elfelejti a free utasítást.

Na, ilyen például Java-ban nincs, mégis van leak. Szerintem neked nincs elég tudásod ehhez.

Hát, lehet, hogy csak egy pillangó vagyok aki arról álmodik, hogy a gyakorlatban tök jól működik, és nemsokára felébredek, de most én tök nyugodtan alszom, mert a monitorban szépen tudom követni, hogy melyik process hány MB memóriát pazarolt el, és így azt is tudom, hogy nagyjából mennyi idő van még, amíg ez gondot okoz, így nem érnek meglepetések, miközben a hibás programok nem a drága memóriát pazarolják.

Onnan indultunk, hogy a swappiness teljesen mást csinál, mint amit írtál.

Figyelj. Értem amit mondasz. Teljesen egyet is értek veled elméletben, csak éppen a gyakorlat többnyire nem olyan tiszta és szép, mint az elmélet.

Igen, ezt már írtam, hogy ha hősiesen konzerválod a szart, akkor mindig szarban leszel. Nem fognak egyszer csak a homlokukra csapni, hogy jé, YleGreg szarban van, segítsünk neki. Azt látják, hogy YleGreg aprópénzért szopik mosolyogva, tehát pont elég pénzt kap, sőt, mivel mosolyog, még akár csökkenthető is a pénze.