Java bez garbage collectoru

flv

Re:Java bez garbage collectoru
« Odpověď #15 kdy: 07. 04. 2014, 19:47:15 »
Citace
Pro lowlatency aplikace je vhodnější C++ (z výkonového hlediska nabízí mnohem více možností).
Javu takto sice využít jde, ale je to spíše pro její skalní příznivce než něco reálného.

Barclays vyuziva javu na 99% kodu ve svych high-frequency platformach. Tim high-frequnecy mam na mysli takove obchody, kdy zalezi na milisekundach a faktorem je i lokace serveru (server co nejbliz danemu "obcodnimu uzlu").


Sten

Re:Java bez garbage collectoru
« Odpověď #16 kdy: 07. 04. 2014, 20:00:59 »
jestli se nepletu tak: java nema destruktor. a tim ze existuje reference na objekt tak existuje. reference ukazuje na null, objekt se zrusi. jak by jste zarucil tuto funkcionalitu?

Jen pro upřesnění: Obdobou destruktoru je v Javě metoda finalize(). GC ji volá, když na objekt už nevedou (poprvé) žádné reference. Docela vtipné na ní je, že má k dispozici referenci na objekt, takže ho může učinit opět dostupným a zabránit jeho vymazání. Každopádně nelze se spolehnout na to, kdy ji GC zavolá a kdy se objekt smaže. Takže programátor musí počítat s tím, že nic z toho se nestane "hned" poté, co na objekt už nebudou odkazovat žádné reference.

finalize má ještě další dost zásadní problémy:
  • běží v jiném vlákně a program je v nedefinovaném stavu (může, ale nemusí běžet)
  • používání zámků a synchronized snadno vede k deadlocku, protože vlákno držící zámek může být právě zablokované garbage collectorem
  • hodně HODNĚ znesnadňuje garbage collectoru práci při nedostatku paměti; pokud máte finalize pro velké objekty, zahráváte si s OutOfMemoryException
  • nikdy nevíte, jestli byl garbage collector vyvolán nedostatkem paměti; veškeré alokace ve finalize se pak rovnají ruské ruletě
  • výjimky ve finalize se ignorují; pokud dokončení nějaké akce ve finalize (např. flush) může selhat, tak se o tom aplikace nedozví

A to obnovování reference ve finalize bych doporučoval jen zkušeným masochistům.

TL;DR: v Javě nikdy nepoužívejte finalize, pokud si nejste naprosto jisti tím, co děláte. Pokud je to jen trochu možné, tak try/finally je lepší řešení.

Re:Java bez garbage collectoru
« Odpověď #17 kdy: 07. 04. 2014, 21:30:39 »
Jen pro upřesnění: Obdobou destruktoru je v Javě metoda finalize(). ... Každopádně nelze se spolehnout na to, kdy ji GC zavolá a kdy se objekt smaže.
Nelze se spolehnout dokonce ani na to, že ji vůbec zavolá. Garantováno je jen to, že na jednom objektu bude finalize zavoláno nejvýše jednou.