[Java lista] switch
ern0
ern0 at linkbroker.hu
2008. Nov. 9., V, 23:08:15 CET
atleta:
> De hat a lenyeg az, hogy a legtobb esetben nem tudod pontosan, hogy
> mikortol nincs rajuk szukseg, vagy legalabbis ezt nagyon munkas
> kitalalni. Teljesen altalanos esetben egy GC-t kell hozza irni ;).
Azert azok az objektumok nem az erdoben nonek, es nem a tudobaj viszi el
oket, hogy ne tudjam, mikor keletkeztek es meddig kellenek. En igenis
tudom, meddig kellenek. Valami masik objektum letrehozta oket vagy s.k.,
vagy megrendelte egy factory-tol, es amikor o meg fog halni, akkor vagy
meghagyja hagyatekkent, vagy elpucolja az altala letrehozottakat.
Nem szeretem, ha valaki azert kedveli a GC-t, mert nem kell torodni a
birtoklassal vagy hogy hivjak ezt.
Furanak hathat, hogy ennek ellenere szerintem a GC az egyenes folytatasa
annak az utnak, amit a prgmozas gyakorlatanak fejlodese bejart az elmult
evekben, ertem ezalatt, hogy kb. soros -> proceduralis -> oop (a pontos
elnevezeseket nem ismerem). Azt talan nem kell ecsetelnem, hogy a
multithreading az egy szalu oop-hoz kepest hatalmas lehetosegeket rejt.
Fura, hogy egy "technologia" okozza ezt, de ha jobban belegondolunk, a
stackon letrehozott lokalis valtozok is hasonlo "technologiai" megoldas
volt (persze q. regen).
Es ha mar van multithreading, miert ne lehetne mindig egy GC thread, aki
idle idoben vegzi el a cleanup-funkciokat? Sok objektum (peldany)
hasznalata eseten nagyon kivilaglik, de keves objektum eseten is
belathato, hogy az olyan _improduktuv_ feladatokat, mint amelyek a
cleanup-ban vannak (incl. mem free), celszerubb nem azonnal elvegezni,
hanem akkorra hagyni, amikor nincs mas melo.
Gondoljatok a mosogatasra! Ha azonnal elmosogatsz, lekesed a krimi
elejet, viszont lesz eleg idod, amikor a reklam megy. Esetleg megkered a
masik thread-et :-)
Peter Verhas wrote:
> Megtisztelve érzem magam, hogy ern0 barátomnak új dolgot mondhatok:
>
> C-ben (meg C++-ban) az objektumaidat felszabadítod, Java-ban pedig
> nem? Nos a következő a helyzet:
>
> C-ben meghívod a 'free' függvényt, és ezzel _jelzed_ a memóriakezelő
> számára, hogy az a memória neked nem kell. Majd ő felszabadítja,
> újrafelhasználja ha és ahogy és amikor akarja. Nyilvántartod magadnak,
> hogy mikor és meddig kell neked a memória terület, újra és újra
> leprogramozod a nyilvántartást, és amikor senkinek nem kell, akkor azt
> mondod, hogy 'free'.
Azert tul sokat nem okoskodik rajta, mindossze arrol van szo, hogy a
malloc/free (meg az obstack meg meg ami van) egy layer az oprendszer es
a prgmod kozott.
> A C-beli módszer sokkal hatékonyabb kódot eredményez, ha nincs benne
> hiba és ha jól programoztad le. Ha nem programoztad le jól, akkor
> elszáll, és akkor lassabb is lehet a memória kezelés, mint a JVM
> memória kezelése és a GC.
Pontosabban mem leak lesz, es az "nem jo".
> tanultuk (én pl. 1984-ben), hogy a 'free' az nem szabadít fel, csak
> megjelöli a memória darabot, mint felszabadíthatót.
Pontosabban, azt olvastam, hogy a C standard library ugy foglal memoriat
(marmint a malloc/free-rol beszelunk, mivel a new/delete ezt hasznalja),
hogy
1. minden memoriafoglalasi blokk (amit malloc()-kal kersz) meretet
felkerekiti 2 hatvanyara, de legalabb 16 byte-ra (vagy valami e korulire);
2. minden kulonbozo meretu blokknak kulon pool-t tart fenn (egyet a
16-osoknak, egyet a 32-eseknek), egeszen a page size-ig (ami az
oprendszer memoriafoglalasi egysege);
3. a felkerekites utan azonos meretu blokkokat a megfelelo pool-bol
szolgalja ki, eloszor meglevo page-ben keres ures helyeket, ha nincs, uj
page-t foglal;
4. a kulonbozo meretu blokkok kulon pool-ba kerulnek (azaz ha a prg egy
32->32 es egy 33->64 byte-os foglalassal indit, az 2 page lesz);
5. a page-nal nagyobb meretu blokkoknak kulon page-eket foglal, az
utolso page-be mas nem kerul;
6. na meg persze kell hely a tablazatoknak.
Free eseten egyertelmu: ha egy page-ben minden blokk free-re kerult,
akkor azt visszaadja.
More info:
http://www.aquaphoenix.com/ref/gnu_c_library/libc_18.html#SEC18
Fentiek fenyeben ertheto, hogy miert nem okoz feltetlenul segfault-ot
egy kisse tulszaladt cimzes, vagy egy mar felszabaditott objektum
hasznalata.
Bevallom, en csak nemreg tudtam meg ezt, viszont nagyon tetszik; nem
vagyok egy elmeleti matematikus, de azt hiszem, altalanos celra ez ha a
memoriafoglalas szempontjabol nem, de ha az adminisztracio koltsegeit is
belevesszuk, valoszinuleg optimalis megoldas.
Termeszetesen ha egy prgm eseteben sulyponti kerdes a memoriahasznalat
(ugye, ami a fenti modellt szivatja, az a 2 hatvanyanal eggyel nagyobb,
kulonbozo meretu kicsi, es a page size-nal eggyel nagyobb blokkok
esete), akkor erdemes megfontolni az obstack-ok hasznalatat (stack
tipusu memoriafoglalasi terkep, mindig csak az utoljara lefoglalt
szabadithato fel, persze egyszerre hasznalhato tobb obstack is)
http://www.aquaphoenix.com/ref/gnu_c_library/libc_33.html#SEC33
vagy kiokumlalhato sajat memoriafoglalasi strategia, netantan GC
hasznalata (feltetelezem, van ilyen C++-hoz is).
Pl. ha egy weboldalat kellene kigeneralni C/C++-szal, akkor az lenne a
megoldasom, hogy
- meghataroznam, hogy egyszerre parhuzamosan mennyi oldalat lehet
lekerni a rendszerbol,
- biztositanam, hogy ne is lehessen tobbet lekerni,
- az oldal generalo prgmnak jo nagy, fix meretu memoriat foglalnek
elore, ami ugymond kitolti a rendelkezesre allo memoriat (minusz oprsz,
sql server stb.),
- a malloc/new primitiven ebbol csipegetne, egyre csak fogyasztana,
- es persze nincs free/delete,
- csak a legvegen, amikor az oldal generalas elkeszult, illetve akkor
sem szabaditanam fel, csak lehet elorol csipegetni.
Ha keves a fix meret, akkor csokkentenem az egyszerre kiszolgalhato
oldalak szamat, vagy vennek memoriat.
Lehet, hogy a konkret peldara van jobb, mar bevalt megoldas, csak azt
akartam szemleltetni, hogy lehet olyan eset, amikor a memoriafoglalas
sajat erobol megoldasa segithet.
Nu ja, Java-ban egy ilyesmit nehez megcsinalni, viszont C/C++-ban meg a
GC (mint memoriakezelesi strategia) - bar biztos van hozza - nem lehet
egyszeru.
--
ern0.scene.plus4.amiga.code.muzak
Haben Sie Fragen?
További információk a(z) Javalist levelezőlistáról