Já o schopnostech GC pochybnosti mám. Protože to, co je opravdu třeba uklidit rychle je právě "nepaměťový" binec. Soubory, sockety a další takové věci. Když po chycení chyby zůstane (potenciálně dost dlouho) viset zamčený soubor nebo otevřený socket, tak to není úplně OK.
Soubory, sockety a další alokované prostředky neřeší GC, ale destruktory, které se aktivují ihned po zrušení deskriptoru na objekt. GC se aktivuje až když dochází volná paměť. Takhle to funguje alespoň ve slušně napsaných jazycích.
O kterém jazyce je teď řeč? Třeba Java AFAIK destruktory nemá. A soubory se v ní musí uklízet ručně, aby nezůstávaly viset než se GC probere.
Nesmí se také zapomínat na zotavení z výjimek. Když ho uděláš v main loopu aplikace, tak ti nespadne, ale přejde do nějakého výchozího stavu. Je to taková poslední záchrana. Samozřejmě musíš vše řádně zalogovat, což obvykle není problém.
No tak nějaký všežravý catch blok v main loopu je zrovna dost pochybný obrat. Ok, chytnu v něm nějakou nečekanou výjimku. Je pravděpodobně nečekaná, protože očekávanou bych chytl nějakým cíleným catchem. Nevím o ní nic, takže ji můžu akorát tak zalogovat. Co vím o stavu programu? Akorát to, že se mi nečekaně přerušil nějaký kus kódu před dokončením. Co vím o invariantech? Ta výjimka byla nečekaná, takže klidně mohla vyletět v momentě, kdy byly invarianty rozbité.
Jediný způsob, jak se v takovém případě dostat do známého stavu, je zahodit úplně všechno a začít odznova. To už můžu místo toho použít nějaký výrazně jednodušší watchdog proces.