你怎么完全关闭xodus?

时间:2018-06-08 22:54:08

标签: xodus

如何让xodus完全关闭并释放资源?

关闭所有打开的环境不会停止共享线程,也不会释放(有时是大量)缓存中的数据量。

例如,现在,我有一个假设停止的xodus环境,但我仍然使用8 GB的RAM,我想要的是jetbrains.exodus.core.dataStructures.ConcurrentLongObjectCache $ CacheEntry(及其相关的byte []对象)再生...

- 随访 -

以下代码是我发现释放缓存内存所必需的代码,主要由xodus保存在静态对象中:

init

以下调用将停止大多数线程:

    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();

我发现,在调用任何/所有上述内容后,我可以安全地重启xodus。

如果要停止所有线程,请执行以下操作:

ThreadJobProcessorPool.getProcessors().forEach(jobProcessor -> jobProcessor.finish());

但是,我发现xodus在执行此操作后没有正确重启 - 这与SPAWNER尝试重新启动自身的方式有关,我还没有考虑过。

1 个答案:

答案 0 :(得分:0)

目前,没有一种方法可以完全卸载Xodus。

说到RAM,您可以通过调用公共静态方法{{1}}来回收缓存数据使用的内存。请确保当时关闭所有环境,否则很可能发生OutOfMemoryError。

对于后台线程,没有解决方法来完成它们。请按照功能请求:https://youtrack.jetbrains.com/issue/XD-729