Kezdőlap › Fórumok › Programozás › Java – dispose
- This topic has 20 hozzászólás, 5 résztvevő, and was last updated 19 years, 11 months telt el by
kl223.
-
SzerzőBejegyzés
-
2005-08-08-19:18 #2025695
B) naigen.
De egyébként pl. Delphinél is voltak anno nekem oanok, hogy szépen kigondolom, hogy fogom csinálni, de õ kitalálta, hogy vmi szabálytalan dolgot csináltam (pl. változókonverziókkal mindig szívtam, etc), amit nem lehet kikerülni, ezért az egész tervemnek annyi….
javaban azért kevesebb van ebbõl szerencsére, meg sokkal jobb a doksi is hozzá…
kl223
2005-08-08-19:33 #20256961-2 észrevétel:
-a dispose nem szünteti meg az objektumot, csak a natív erõforrsáokat szabadítja fel
-a gc nem „köteles” csinálni semmit amíg van memóra
-a finalize hívása nem jelent semmit (vagyis az hajtódik végre amit a finalize metódusba írtál, de más nem történik != C destruktor!!! )
-a null -ra állítás akkor kell, ha referencia marad rá, de már nem használod (jó példa a stack tömbbel megvalósítása, ugye a stack pointer alatti(vagy fölötti) tömbelemek már nem használtak de a tömbben a ref megmarad amíg felül nem írod, itt jól jöhet a nullázás)esetleg (bár ebben az esetben nem látom konkrétan értelmét, de talán active_frame lehetne) weakrefernce használata
2005-08-08-19:48 #20256971-2 észrevétel:
-a dispose nem szünteti meg az objektumot, csak a natív erõforrsáokat szabadítja felígy van!
-a gc nem „köteles” csinálni semmit amíg van memóra
elv ha meghívjük explicit módon (System.gc()) akkor összetakarít mindent, amit csak lehet:
SUN Java System.gc() referencia: „When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.”-a finalize hívása nem jelent semmit (vagyis az hajtódik végre amit a finalize metódusba írtál, de más nem történik != C destruktor!!! )
Hm. ezt nem is tudtam… mindenesetre eddig nem volt rá szükség, hogy a finalize-t explicit módon hívjam. Felmerül azonban a kérdés ekkor, hogy egy objektum belülrõl tudja-e törölni saját magát?
Mert gondolom a this=null; nem fog menni… 🙂
Mert más módot nem látok arra, hogy az objektum referenciáját átállítsuk nullra. Ill ezt se, mert ez se hiszem, hogy megy… 🙂-a null -ra állítás akkor kell, ha referencia marad rá, de már nem használod (jó példa a stack tömbbel megvalósítása, ugye a stack pointer alatti(vagy fölötti) tömbelemek már nem használtak de a tömbben a ref megmarad amíg felül nem írod, itt jól jöhet a nullázás)
esetleg (bár ebben az esetben nem látom konkrétan értelmét, de talán active_frame lehetne) weakrefernce használata
[align=right][snapback]144647[/snapback][/align]hát elv mi is a gyenge referencia? Ha jól tudom épp az a lényege, hogy azt a gc nem veszi figyelembe… de ez nem biztos, csak vmi rémlik…
kl223
2005-08-09-09:19 #2025698így van!
elv ha meghívjük explicit módon (System.gc()) akkor összetakarít mindent, amit csak lehet:
SUN Java System.gc() referencia: „When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.”„best effort” 🙂 és az elõzõ mondatban is suggest van…
Hm. ezt nem is tudtam… mindenesetre eddig nem volt rá szükség, hogy a finalize-t explicit módon hívjam. Felmerül azonban a kérdés ekkor, hogy egy objektum belülrõl tudja-e törölni saját magát?
nem, de ez miért kellene??
Mert gondolom a this=null; nem fog menni… 🙂
a this final…
hát elv mi is a gyenge referencia? Ha jól tudom épp az a lényege, hogy azt a gc nem veszi figyelembe… de ez nem biztos, csak vmi rémlik…
ha valamire csak gyenge ref van és kell mem azt automatikusan felszabadítja a gc
2005-08-09-09:41 #2025699„a gc nem „köteles” csinálni semmit amíg van memóra”
én is ebben reménykedem már csak azért is, mert
„ha valamire csak gyenge ref van és kell mem azt automatikusan felszabadítja a gc”
nem szabadul fel, vagy legalábbis nem mindig, meg ilyesmi – ugyanannál a kódnál – pl. ilyen esetben sem:
class…
…void …() {
… valami // ennek kéne felszabadulnia
}Ami lehet, hogy nem is meglepõ, mert a java-nak a filozófiája, hogy nem szabadítgatunk menetközben, mert az nagyon lassít, de hogy gc-re sem szabadul fel, az meglepõ. (Lehet, hogy a fizika törvényei nálam felsülnek :), de így van… a sun példaprogramával is így van.)
Számomra ez egy kicsit furcsa, ugyanakkor teljesen logikus lenne, ha csak java lenne… bár lehet, hogy meg van oldva, hogy úgy kommunikál a host-tal, hogyha a hostnak memóriára van szüksége felszabadítja. (Bár ezt nem tudom, hogy lehet megoldani – nem ismerem a jvm-et.)„”best effort””
Pont erre gondoltam: a legjobb nem a legjobb, csak a legjobb ami van :)))„this=null;”
Hát ez elég fura lenne, mert innentõl kezdve már a függvény nem tudna befejezõdni/visszatérni. (Mert ugye ilyenkor még történik 3-4 processzor utasítás, ami elveszne az „éterben”. De egy „kártevõnek” kifejezetten ideális lenne :)))2005-08-09-11:15 #2025700
Hát ez hihetetlen! Még ez is mûködik: string += „hello”;… Tudom egy újszülötnek minden új, de eszembe nem jutott volna kipróbálni, de most praktikus lett volna, úgyhogy legfeljebb mondom „hûjének” néz a fordító – erre megcsinálta.
Tudom nem tartozik ide, de muszáj volt leírnom :)))
2005-08-09-14:34 #2025701
Hát ez hihetetlen! Még ez is mûködik: string += „hello”;… Tudom egy újszülötnek minden új, de eszembe nem jutott volna kipróbálni, de most praktikus lett volna, úgyhogy legfeljebb mondom „hûjének” néz a fordító – erre megcsinálta.
Tudom nem tartozik ide, de muszáj volt leírnom :)))
[align=right][snapback]144731[/snapback][/align]hehe 🙂 igen, mûxik, de a háttérben valójában StringBufferekkel oldja meg a rendszer az ien mûveleteket.
Ezért ha olyasmit csinálsz, hogy egy stringhez adnál hozzá egyenként karaktereket/szavakat, (pl. vmilyen ciklusban, etc) akkor érdemes StringBuffert explicit módon használni, és utána Stringet csinálni, mikor minden benne van, aminek benne kell lennie… 😉kl223
2005-08-10-07:19 #2025702hehe 🙂 igen, mûxik, de a háttérben valójában StringBufferekkel oldja meg a rendszer az ien mûveleteket.
Ezért ha olyasmit csinálsz, hogy egy stringhez adnál hozzá egyenként karaktereket/szavakat, (pl. vmilyen ciklusban, etc) akkor érdemes StringBuffert explicit módon használni, és utána Stringet csinálni, mikor minden benne van, aminek benne kell lennie… 😉kl223
[align=right][snapback]144768[/snapback][/align]az a baj, hogy nem, hanem stringekkel oldja meg és mindig új objektumokat kell létrehoznia, mivel string imutable és így O(n^2), stringbufferrel meg lineáris, mondjuk két string összefûzésénél mind1, de for(int i=0;i<1000;i++) s+="a"; nem ideális 🙂
2005-08-10-12:21 #2025703obj = new … esetén tovább nõ a program által foglalt memória, de a freeMemory() többet mutat. Ami viszont a leírás szerint a jvm-en belüli szabad memóriát jelenti.
Minnél több objektumot hozok létre és hagyok ott „szemétként”, annál több memóriát foglal a program, viszont annál többet mutat a freeMemory() is.
Ennek a tudatában kiszámoltam, hogy nálam a szemét tényleg szemét :).
Azt, hogy mikor fogja felszabadítani nem tudom ill. úgy gondolom, hogy a maxMemory()-nál. Azt meg gondolom valahol állítani lehet…„for(int i=0;i<1000;i++) s+="a";"
Egyébként ez valóban elég ritka lehet :))))2005-08-10-17:21 #2025704az a baj, hogy nem, hanem stringekkel oldja meg és mindig új objektumokat kell létrehoznia, mivel string imutable és így O(n^2), stringbufferrel meg lineáris, mondjuk két string összefûzésénél mind1, de for(int i=0;i<1000;i++) s+="a"; nem ideális 🙂
[align=right][snapback]144849[/snapback][/align]hm….
The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method.
Erre mondtam, hogy StringBufferekkel oldja meg a háttérben azt az összefûzést. A gond ott van, hogy a ciklus minden egyes iterációjában így újabb StringBuffert hoz létre. Ami nem egészséges a memóriára nézve. Ezért érdemes explicit módon az egész for ciklushoz egyetlen StringBuffert használni.
üdv!
kl223 -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz