( asch | 2016. 03. 10., cs – 22:14 )

Az a probléma, hogy ha out of memory van, az több szál futása esetén egy csomó mindent el tud rontani. Illetve mivel oom van, ezért már magát az exceptiont sem feltétlen lehet allokálni. Meg a loggolást. Meg semmit. És elég valószínűtlen, hogy a követlező utasítás felszabadítana helyet, inkább foglalni akar az is. Stb... A sok gondolkodás eredménye az, hogy a javaslat az lett a Java világban, hogy ez egy nem kezelendő exception, hanem egy mindenképpen abort-hoz vezető error.

De az alapgondolat jó. Lehet tervezni a memóriával. Le tudod kérdezni, hogy mennyi szabad, és aszerint dönthetsz, hogy elindítasz-e egy feldolgozást, vagy várakoztatod. Ezt csinálhatod dinamikusan (futás idejű mérésre alapozva), vagy statikusan előre számítás alapján (X db lehet egyszerre és kész).

A problémát kezelni így lehet:
* Ha valódi memory leak, akkor le kell vadászni (profiler, memory dump, stb) és punktum.
* Esetleg ha tervezhető (feldolgozásonként beragad X MB), akkor időnként újraindítva a szolgáltatást (akár két szerveren felváltva, hogy ne legyen lefedetlen idő) el lehet karistolni a szolgáltatás leállása nélkül. De ezt megcsinálni sem egyszerű, csak vészmegoldásként csinálnám. Bár ha valóban mission critical, hogy ne legyen leállás, akkor amúgy sem ártana egy klaszterezést megcsinálni.
* Ha csak a feldolgozás miatt van pillanatnyi OOM, akkor meg kell becsülni, hogy egy taszk X MB, és Y MB van, akkor N=Y/X taszknál több ne fusson egyszerre. Ezt a legegyszerűbb az alkalmazáson belül megoldani (várakozási sor, és N db feldolgozó), de ha nem lehet az alkalmazáshoz nyúlni, akkor valami előtétet is lehet faragni (Isten ments, de tudjuk, hogy ilyen az élet...)
* Persze amit mások írtak azzal is foglalkozni érdemes: magát a feldolgozást is kellene memóriára optimalizálni, mert valószínűleg "kicsit" pazarló

(Még egy kicsit árnyalja a képet, hogy a Java alatt többféle heap van: menedzselt Java heap és "malloc heap" - azaz a C-ből elérhető heap. És a "malloc heap"-ből is lehet Java alól allokálni (direct memory a Java nevezéktan szerint), de ennek is van egy limitje. Ráadásul a Java alól foglalt Direct memory darabkák garbage collection alatt szabadulnak fel annak ellenére, hogy malloc-cal vannak foglalva a C heapről. Csak hogy egyszerűbb legyen :-)