如何让xodus完全关闭并释放资源?
关闭所有打开的环境不会停止共享线程,也不会释放(有时是大量)缓存中的数据量。
例如,现在,我有一个理应停止的xodus环境,但我仍然有使用8 GB内存的jetbrains.exodus.core.dataStructures.ConcurrentLongObjectCache$CacheEntry (及其相关的byte[]对象),我想回收这些内存...
--后续--
下面的代码是我发现释放缓存内存所必需的代码,这些内存主要由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在执行此操作后不能正确地重新启动-派生程序尝试重新启动自身的方式有问题,这一点我没有研究过。
发布于 2018-06-09 23:41:55
目前,还没有一种合适的方法来完全卸载Xodus。
说到内存,您可以通过调用公共静态方法jetbrains.exodus.log.Log.invalidateSharedCache()来回收缓存数据所使用的内存。请确保此时所有环境都已关闭,否则很可能会发生OutOfMemoryError。
至于后台线程,没有完成它们的变通方法。请遵循功能请求:https://youtrack.jetbrains.com/issue/XD-729。
https://stackoverflow.com/questions/50769329
复制相似问题