首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何完全关闭xodus?

如何完全关闭xodus?
EN

Stack Overflow用户
提问于 2018-06-09 06:54:08
回答 1查看 147关注 0票数 1

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

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

例如,现在,我有一个理应停止的xodus环境,但我仍然有使用8 GB内存的jetbrains.exodus.core.dataStructures.ConcurrentLongObjectCache$CacheEntry (及其相关的byte[]对象),我想回收这些内存...

--后续--

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

代码语言:javascript
复制
    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();

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

代码语言:javascript
复制
ThreadJobProcessorPool.getProcessors().forEach(jobProcessor -> jobProcessor.finish());

我发现,我可以在调用上面的任意一个/所有函数后安全地重新启动xodus。

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

代码语言:javascript
复制
    Field spawner = ThreadJobProcessorPool.class.getDeclaredField("SPAWNER");
    spawner.setAccessible(true);
    Object threadJobSpawner = spawner.get(null); //static field
    threadJobSpawner.getClass().getMethod("finish").invoke(threadJobSpawner);

但是,我发现xodus在执行此操作后不能正确地重新启动-派生程序尝试重新启动自身的方式有问题,这一点我没有研究过。

EN

回答 1

Stack Overflow用户

发布于 2018-06-09 23:41:55

目前,还没有一种合适的方法来完全卸载Xodus。

说到内存,您可以通过调用公共静态方法jetbrains.exodus.log.Log.invalidateSharedCache()来回收缓存数据所使用的内存。请确保此时所有环境都已关闭,否则很可能会发生OutOfMemoryError。

至于后台线程,没有完成它们的变通方法。请遵循功能请求:https://youtrack.jetbrains.com/issue/XD-729

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50769329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档