.[ ČeskéHry.cz ].
Proč nefunguje garbage collector?

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Java / J2ME
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Val



Založen: 18. 06. 2013
Příspěvky: 19

PříspěvekZaslal: 31. červenec 2013, 20:44:06    Předmět: Proč nefunguje garbage collector? Odpovědět s citátem

(budu psát o Javě, kterou znám nejlépe, ale je to IMHO i záležitost .NETu apod.) Setkávám se s tím pořád - ačkoliv v knížkách o Javě se píše jak je rychlá, skvělá a jazyky, které se překládají přímo do strojového kódu (např C++) beznadějně zastaralé, tak v reálu jsou často programy psané v Javě pomalé přesto, že výkon CPU a velikost paměti neustále rychle roste.

Zajímá mě hlavně fakt, že hodně Java aplikací co denně používám si neustále ukusuje z paměti (a ne málo), ale už ji nechce uvolňovat - což po určité době vede k vyčerpání RAM, značnému propadu výkonu a je nutné aplikaci restartovat.

Jak je to možné, vždyť garbage collector by měl tohle řešit za programátora? Kde je chyba - v programu, v platformě nebo úplně jinde? A jak se tomu vyhnout při vytváření vlastních aplikací?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 31. červenec 2013, 20:57:41    Předmět: Odpovědět s citátem

citace:
Setkávám se s tím pořád - ačkoliv v knížkách o Javě se píše jak je rychlá, skvělá a jazyky, které se překládají přímo do strojového kódu (např C++) beznadějně zastaralé


Ano.. snaha prodat knížky a protlačit Javu. Měl jsem na serveru nějaké programy v Javě svého času. 800MB RAM v "hajzlu" na programu, který potřeboval max 100. Přepsal jsem to do C++ a: běží to daleko rychleji a zhruba na 110MB RAM.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 31. červenec 2013, 21:30:06    Předmět: Odpovědět s citátem

doporucuju si precist: http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/

Cely clanek je sice tematicky zamereny jinam, ale od odstavce: "Not designed for performance" pres "All about garbage collectors" a dal je to velmi pekny uvod do toho o cem GC je, jake ma vyhody a nevyhody.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Amorph



Založen: 06. 09. 2007
Příspěvky: 68

PříspěvekZaslal: 1. srpen 2013, 12:28:27    Předmět: Odpovědět s citátem

quas4: zajimavej clanek, diky! Jinak imho gc v jave je pouzitelnej za predpokladu, ze mas pameti dost, ale na automatiku se neda prilis spolehat, je treba jeho volani nejak vhodne osetrit. Kdyz jsem psal pred lety mobilni aplikace, tak jsem ho radsi ale zakazoval a pouzival jen explicitni volani ve vhodny moment, protoze jinak se casto choval dost nedeterministicky a delalo to nezadouci spiky ve vykonu. Ale mozna se to za ta leta uz zlepsilo, to nevim. A nakonec jsem se teda snazil psat vsechno co nejvic staticky (naalokovat rovnou s rezervou vse co muzu kdy potrebovat) i kdyz je jasne, ze se to da pouzit jen v urcitych pripadech, kdy se da aspon odhadnou maximalni pametova narocnost a zaroven si to muzu dovolit s ohledem na podminky behu moji aplikace.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 2. srpen 2013, 07:26:47    Předmět: Odpovědět s citátem

ono to nie je ze by garbage collector tie objekty neuvolnil. ale java si uz raz zabranu pamet neuvolnuje. teda ak mate v programe nejaku spicku v pouzivani pameti tak vam potom vyuzitie neklesne aj ked ju uvolnite. Java si ju proste bude drza na dalsie alokacie.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
tomkis



Založen: 06. 06. 2011
Příspěvky: 33

PříspěvekZaslal: 2. srpen 2013, 18:13:00    Předmět: Odpovědět s citátem

nou napsal:
ono to nie je ze by garbage collector tie objekty neuvolnil. ale java si uz raz zabranu pamet neuvolnuje. teda ak mate v programe nejaku spicku v pouzivani pameti tak vam potom vyuzitie neklesne aj ked ju uvolnite. Java si ju proste bude drza na dalsie alokacie.
Tohle tak úplně není pravda, JVM paměť uvolní (XX:MaxHeapFreeRatio), naneštěstí tohle číslo bývá velmi vysoké (kolem 90%)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Val



Založen: 18. 06. 2013
Příspěvky: 19

PříspěvekZaslal: 24. srpen 2013, 12:15:56    Předmět: Odpovědět s citátem

Trochu jsem si s tím teď hrál. Vytvořil si testovací prográmek abych viděl jak se to chová.

Při opakovaném volání funkce ve které se alokuje paměť jsem viděl, že java odmítala vůbec uvolnit paměť, dokud to nedosáhlo meze zhruba 1GB (moje PC má celkem 6GB RAM). Pak už se drží na této mezi a uvolňuje jen aby to nebylo přes. Ten 1GB odmítá uvolnit i když ví, že ho nepotřebuje a to i tehdy, když ostatní programy zbytek paměti zaplní a PC jde do kolen.

Pokud spustím tento testovací prográmek víckrát, tak každý si klidně vezme svůj 1GB paměti - takže stačí pár náročnějších java programů a postupně vám sežerou paměť - respektive drží si paměť kterou už nepotřebují.

No nevím, moc se mi to nelíbí i když předpokládám, že tvůrci Javy k tomu měli jistě dobrý důvod. Minimálně to skvěle zapadá do strategie firmy Oracle - tj vytvářet robustní a neskutečně rozežraný SW.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
goddard



Založen: 06. 11. 2007
Příspěvky: 175
Bydliště: Brno

PříspěvekZaslal: 24. srpen 2013, 13:15:11    Předmět: Odpovědět s citátem

jak psal nou, tak jvm si alokovanou pamet drzi pokud ho nedonutite pomoci flagu k necemu jinemu. dalsi vec je, ze poustet jvm bez flagu pro min. a max. velikost haldy je trosku nezodpovedne. pro optimalni vykon se doporucuje nadsadit odhadovane pozadavky na pamet (ram) o 30% (to je taky duvod proc jvm alokovanou pamet neuvolnuje - aby pokryl spicky) a zvolit vhodny gc algoritmus, co z hodne zavisi na dane aplikaci (zivotnost objektu).
lidi na tohle zapominaji, pripadne si mysli ze kdyz maji vm s gc tak automaticky zmizi vsechny problemy spojene se spravou pameti. pritom jde jen o presun z urovne zdrojoveho kodu na uroven administrace prostredku aplikace v os.
_________________
http://www.dredwerkz.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Val



Založen: 18. 06. 2013
Příspěvky: 19

PříspěvekZaslal: 24. srpen 2013, 20:38:36    Předmět: Odpovědět s citátem

Nj, ale já nemusím vědět kolik bude program potřebovat z haldy a když to nastavím příliš nízko tak aplikace spadne.
Jak se dá nastavit GC aby si paměť nesyslil, ale vracel jí systému?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
goddard



Založen: 06. 11. 2007
Příspěvky: 175
Bydliště: Brno

PříspěvekZaslal: 24. srpen 2013, 21:12:43    Předmět: Odpovědět s citátem

Val napsal:
Nj, ale já nemusím vědět kolik bude program potřebovat z haldy a když to nastavím příliš nízko tak aplikace spadne.
Jak se dá nastavit GC aby si paměť nesyslil, ale vracel jí systému?


imho bys to mel zjistit kolik tvuj program sezere kvuli nastaveni min. a max. velikosti haldy. netbeans a jine ide maji profilery ktery ti tohle cislo prozradi, nebo muzes spustit aplikaci s timhle flagem:
java -verbose:gc

pro navraceni pameti systemu muzes zkusit -XX:MinHeapFreeRatio=<hodnota>

viz http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
_________________
http://www.dredwerkz.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Val



Založen: 18. 06. 2013
Příspěvky: 19

PříspěvekZaslal: 24. srpen 2013, 22:27:52    Předmět: Odpovědět s citátem

Nj, ale pokud program načítá data ze souborů/databáze u kterých dopředu neznáš velikost tak stejně nevíš kolik to v důsledku sežere paměti.
Hrál jsem si s tím MinHeapFreeRatio a MaxHeapFreeRatio, nejdřív to nemělo vliv (respektive ne co bych čekal) až když jsem nastavil -XX:+UseSerialGC tak to zafungovalo (defaultně se předpokládám pro můj komp použije parallel GC)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
goddard



Založen: 06. 11. 2007
Příspěvky: 175
Bydliště: Brno

PříspěvekZaslal: 25. srpen 2013, 08:07:19    Předmět: Odpovědět s citátem

Val napsal:
Nj, ale pokud program načítá data ze souborů/databáze u kterých dopředu neznáš velikost tak stejně nevíš kolik to v důsledku sežere paměti.


jak to ze to nevis? nevis to proto protoze jsi to predem nezjistil kdyz jsi delal analyzu. pokud se tech dat vrati vic, jde to "vzdycky" programove osetrit abys nedostal OOM.
nebo si myslis ze ty tuny enterprise sw napsanyho v jave tohle nikdy nemusi resit a vsechno bezi s defaultni min. a max. velikosti haldy? Smile
_________________
http://www.dredwerkz.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Val



Založen: 18. 06. 2013
Příspěvky: 19

PříspěvekZaslal: 25. srpen 2013, 11:14:11    Předmět: Odpovědět s citátem

goddard napsal:

jak to ze to nevis?


Dejme tomu - aplikace pro zobrazování obrázků, obrázky mají většinou rozumné rozlišení, ale někdo třeba bude chtít zobrazit nějaký megaobraz - tantilion x tantilion pixelů, nechci to řešit nějakým chytrým úsporným algoritmem, protože to je výjimečná situace, ale zase proč uživatele limitovat - pokud se to vyjde do paměti... Takovejch případů může být celá řada.
Taky IMHO člověk udělá v tomhle dost snadno chybu a nastaví příliš malé maximum, prostě mi přijde, že nastavovat max heap může být u spousty složitějších prográmků potencionálně nebezpečné a ne úplně jednoduché.

goddard napsal:

nebo si myslis ze ty tuny enterprise sw napsanyho v jave tohle nikdy nemusi resit a vsechno bezi s defaultni min. a max. velikosti haldy? Smile


No enterprise sw od Oracle co používám v práci to má očividně nastaveno tak, že klidně sežere veškerou dostupnou paměť Smile Žádný omezování. Nejhorší je, že jsou tam zřejmě memory leaky (vida ani chytré GC tomuhle nedokáže zabránit), ale to je jiná kapitola.

BTW ví někdo proč MaxHeapFreeRatio nefunguje s parallel GC?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
goddard



Založen: 06. 11. 2007
Příspěvky: 175
Bydliště: Brno

PříspěvekZaslal: 25. srpen 2013, 17:02:13    Předmět: Odpovědět s citátem

jde to jednoduse osetrit tim, ze zjistis kolik je aktualni velikost haldy pred krachem a pri dalsim spustenim to automaticky navysis. nebo nekde udelas v menu predvolbu pro zvyseni haldy a v napovede tuhle situaci popises. anebo se z te oom dostanes tak ze vsechny objekty s tim spojene uvolnis - proste ten obrazek nenactes kdyz zjistis ze je vetsi nez nastavena halda.
to ze je to potencialne nebezpecne a ne uplne jednoduche je mozna pravda, ale za svou 8 letou praxi s javovskyma aplikacnima serverama jsem se nesetkal s tim ze by nekde dlouhodobe stacil default a ze by vyrobce aplikace nedodal alespon minimalni pozadavky.
proste si holt budes muset dat tu praci a prohnat svou aplikaci v prubehu vyvoje nekolikrat profilerem a poradne ji otestovat.
pokud delas prohlizec obrazku, je to jednoduchy - musis zjistit dve veci - kolik zere sama o sobe a pak treba prumernou velikost obrazku. tak si nastavis haldu, nadsadis 30% a je to. pokud to nekdy nekomu spadne na OOM vyjimce, tak zkus dodat tu funkcionalitu ktetrou jsem popsal na zacatku.
_________________
http://www.dredwerkz.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Java / J2ME Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna