Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Val
Založen: 18. 06. 2013 Příspěvky: 19
|
Zaslal: 31. červenec 2013, 20:44:06 Předmět: Proč nefunguje garbage collector? |
|
|
(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 |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 31. červenec 2013, 20:57:41 Předmět: |
|
|
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 |
|
|
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 31. červenec 2013, 21:30:06 Předmět: |
|
|
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 |
|
|
Amorph
Založen: 06. 09. 2007 Příspěvky: 68
|
Zaslal: 1. srpen 2013, 12:28:27 Předmět: |
|
|
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 |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 2. srpen 2013, 07:26:47 Předmět: |
|
|
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 |
|
|
tomkis
Založen: 06. 06. 2011 Příspěvky: 33
|
Zaslal: 2. srpen 2013, 18:13:00 Předmět: |
|
|
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 |
|
|
Val
Založen: 18. 06. 2013 Příspěvky: 19
|
Zaslal: 24. srpen 2013, 12:15:56 Předmět: |
|
|
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 |
|
|
goddard
Založen: 06. 11. 2007 Příspěvky: 175 Bydliště: Brno
|
Zaslal: 24. srpen 2013, 13:15:11 Předmět: |
|
|
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 |
|
|
Val
Založen: 18. 06. 2013 Příspěvky: 19
|
Zaslal: 24. srpen 2013, 20:38:36 Předmět: |
|
|
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 |
|
|
goddard
Založen: 06. 11. 2007 Příspěvky: 175 Bydliště: Brno
|
Zaslal: 24. srpen 2013, 21:12:43 Předmět: |
|
|
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 |
|
|
Val
Založen: 18. 06. 2013 Příspěvky: 19
|
Zaslal: 24. srpen 2013, 22:27:52 Předmět: |
|
|
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 |
|
|
goddard
Založen: 06. 11. 2007 Příspěvky: 175 Bydliště: Brno
|
Zaslal: 25. srpen 2013, 08:07:19 Předmět: |
|
|
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? _________________ http://www.dredwerkz.cz |
|
Návrat nahoru |
|
|
Val
Založen: 18. 06. 2013 Příspěvky: 19
|
Zaslal: 25. srpen 2013, 11:14:11 Předmět: |
|
|
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? |
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ěť Žá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 |
|
|
goddard
Založen: 06. 11. 2007 Příspěvky: 175 Bydliště: Brno
|
Zaslal: 25. srpen 2013, 17:02:13 Předmět: |
|
|
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 |
|
|
|