我们将Xodus用于远程探针项目,以便在将临时数据发送到集中式数据库之前先进行存储。因此,我们有几个商店可以根据环境(交通,网络连接等)而增加或减少。多亏了垃圾收集器,我们希望数据库文件的大小有所减少,但目前只是增加了。
我们尝试了几种垃圾收集器配置以尽可能频繁地触发它。例如,我们有:
conf.setGcFileMinAge(1);
conf.setGcFilesInterval(1);
conf.setGcMinUtilization(1);
没有可见的效果...
清空存储后,我们希望看到.xd文件减少或删除,但数据库仍在不断增长。
编辑: 我尝试用下面的简单代码查看GC效果:
Environment exodus = Environments.newInstance(dbPath);
final Transaction xtxn = exodus.beginExclusiveTransaction();
Store store = exodus.openStore("testStore", StoreConfig.WITHOUT_DUPLICATES, xtxn);
xtxn.commit();
Thread.sleep(10 * 1000); // Wait to do actions after first background cleaning cycle
// Fill store, then clear it
exodus.executeInExclusiveTransaction(tx -> {
for(int i = 1; i <= 1000000; i++) {
store.putRight(tx, LongBinding.longToEntry(i), StringBinding.stringToEntry(dbPath));
}
});
clearStore(exodus, store);
exodus.gc();
Thread.sleep(5 * 60 * 1000); // Wait to see GC doing the work
boolean clearStore(final Environment exodus, final Store store) {
Transaction tx = exodus.beginExclusiveTransaction();
try(Cursor cursor = store.openCursor(tx)) {
boolean success = true;
while(cursor.getNext() && success) {
success &= cursor.deleteCurrent();
}
if(success) {
tx.commit();
return true;
} else {
log.warn("failed to delete entry {}", cursor.getKey());
tx.abort();
return false;
}
} catch(Exception e) {
tx.abort();
return false;
}
}
如果我删除了第一个“睡眠”,则表明Garbage Collector正在工作,数据库文件的大小已按预期减小,一切正常。 但是,如果我保持第一个“睡眠”状态,则似乎永远不会调用垃圾收集器。 就像第一个后台清洁周期可以,但以下情况不行... 在此示例中,我保留默认配置。
答案 0 :(得分:1)
有一种Environment.gc()
方法。该方法的javadoc如下:
说环境可以加快后台数据库垃圾收集器的活动。调用此方法不会立即产生后果,例如释放磁盘空间,删除特定文件等。
我不建议您修改默认的GC设置。 EnvironmentConfig.setGcMinUtilization()
可用于使数据库比默认情况下更紧凑,或用于降低GC负载(例如,与批处理更新同时进行)。基本上,更高的所需最低利用率(更少的可用空间)会导致更高的GC负载。
GC按文件清除数据库文件,首先选择利用率最低的文件。清除文件后,不能立即删除该文件,应满足两个条件:
EnvironmentConfig.getGcFilesDeletionDelay()
配置的延迟应该过去。默认是5秒。