如何触发垃圾收集器以减小数据库大小?

时间:2019-06-19 08:12:38

标签: xodus

我们将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正在工作,数据库文件的大小已按预期减小,一切正常。 但是,如果我保持第一个“睡眠”状态,则似乎永远不会调用垃圾收集器。 就像第一个后台清洁周期可以,但以下情况不行... 在此示例中,我保留默认配置。

1 个答案:

答案 0 :(得分:1)

有一种Environment.gc()方法。该方法的javadoc如下:

  

说环境可以加快后台数据库垃圾收集器的活动。调用此方法不会立即产生后果,例如释放磁盘空间,删除特定文件等。

我不建议您修改默认的GC设置。 EnvironmentConfig.setGcMinUtilization()可用于使数据库比默认情况下更紧凑,或用于降低GC负载(例如,与批处理更新同时进行)。基本上,更高的所需最低利用率(更少的可用空间)会导致更高的GC负载。

GC按文件清除数据库文件,首先选择利用率最低的文件。清除文件后,不能立即删除该文件,应满足两个条件:

  1. EnvironmentConfig.getGcFilesDeletionDelay()配置的延迟应该过去。默认是5秒。
  2. 在清除文件之前创建的任何事务(甚至只读)都应完成(提交或中止)。