Zajímalo by mě, co si myslíte o volání system.gc() ručně? Řeším situaci, kdy občas/opakovaně aplikace vytuhne na pár sekund. Napadlo mě, že je to kvůli Garbage collectoru. Soudě dle analýzy VisualVM se nsutále pozvolna plní heap (asi tak o 100KB) až nakonec, když už má třeba 35 MB nebo míň, jde vynášet odpadky. A uvolní tím asi 30 MB, takže hodně. zdá se, že to typicky pak spadne na nějakých 3 MB
To je ohromný množství a vysvětlovalo by to, proč na chvíli úplně vytuhne? Zkusil jsem udělat, aby se GC volal řekněmě každých 5 sekund, a tak se heap drží stále někde kolem 3 - 4 MB.
Zdá se, že to pomohlo, anebo jsem zatím nepozoroval už znovu to zatuhnutí. Napadá mě k tomu:
1) Proč se neustále alokuje nějaká paměť, jde tomu zabránit nebo je to normální?
2) Podezíral jsem, že jsou tam nějaké alokace při každém tiku, ale žádné nenacházím, tak nevím,
3) Po "celém internetu" se píše, že by se ručně GC _nikdy_ volat nemělo. Takže mi to moje řešení mate hlavu, protože to zní jako antipattern. Ale z mojí logiky mi přijde, že lepší uvolnit menší množství, než když pak nakonec vysypává celý heap. Ze stackoverflow.com apod jsem se dočetl, že ten růst heapu je normální
4) GC prý zablokuje všechny thready a objekty, takže to není dobré třeba na webovou službu, ale na android aplikaci to asi není relevantní.