как вы полностью закрыли xodus? - PullRequest
0 голосов
/ 09 июня 2018

Как вы можете заставить 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 пытается перезапустить себя, который я не изучал.

1 Ответ

0 голосов
/ 09 июня 2018

В настоящее время не существует подходящего способа полной выгрузки Xodus.

Говоря об оперативной памяти, вы можете восстановить память, используемую кэшированными данными, вызвав публичный статический метод jetbrains.exodus.log.Log.invalidateSharedCache().Пожалуйста, убедитесь, что все среды закрыты в этот момент, в противном случае очень вероятно возникнет ошибка OutOfMemoryError.

Что касается фоновых потоков, то для их завершения нет обходного пути.Пожалуйста, следуйте запросу функции: https://youtrack.jetbrains.com/issue/XD-729.

...