Как вы можете заставить xodus полностью завершить работу и освободить ресурсы?
Закрытие всех открытых сред не останавливает общие потоки и не освобождает (иногда массивные) объемы данных в кеше.
Например, сейчас у меня предположительно остановлена среда xodus, но у меня все еще есть jetbrains.exodus.core.dataStructures.ConcurrentLongObjectCache $ CacheEntry (и связанные с ним объекты byte []), использующие 8 ГБ ОЗУ,который я хочу вернуть ...
- followup -
Следующий код - это то, что я нашел необходимым для освобождения кэшированной памяти, в основном хранимой в статических объектах xodus:
Field tailPages = Class.forName("jetbrains.exodus.log.SharedLogCache").getSuperclass().getDeclaredField("TAIL_PAGES_CACHE");
tailPages.setAccessible(true);
Object concurrentLongObjectCache = tailPages.get(null); //static field
Method clear = Class.forName("jetbrains.exodus.core.dataStructures.ConcurrentLongObjectCache").getMethod("clear");
clear.invoke(concurrentLongObjectCache);
Log.invalidateSharedCache();
SharedOpenFilesCache.invalidate();
Следующий вызов остановит большинство потоков:
ThreadJobProcessorPool.getProcessors().forEach(jobProcessor -> jobProcessor.finish());
Я обнаружил, что я могу безопасно перезапустить xodus после вызова любого / всего вышеперечисленного.
ЕслиВы хотите остановить все потоки, сделайте следующее:
Field spawner = ThreadJobProcessorPool.class.getDeclaredField("SPAWNER");
spawner.setAccessible(true);
Object threadJobSpawner = spawner.get(null); //static field
threadJobSpawner.getClass().getMethod("finish").invoke(threadJobSpawner);
Однако я обнаружил, что xodus не перезагружается должным образом после этого - что-то не так с тем, как SPAWNER пытается перезапустить себя, который я не изучал.