1

我目前正在RocksDB通过扩展RocksDBConfigSetter接口在我的流应用程序中使用自定义配置。我看到关于关闭cachewriteBufferManager实例的相互矛盾的文档。

现在,我看到 javadoc 和其中一个文档页面建议我们需要关闭所有在覆盖方法中扩展的实例RocksObject(两个实例都扩展了此类)CacheWriteBufferManagerRocksDBConfigSetter#close()

但是,内存管理文档页面建议我们将这些实例创建为静态实例,而不是在被覆盖的方法中关闭Cacheand实例。WriteBufferManagerRocksDBConfigSetter#close()

不知道要在这里遵循什么。如果有人可以帮助我了解哪些文档是正确的,如果我们想通过传入自定义的 RocksDB 配置来限制内存使用量,那么我们将不胜感激。

如果我们将它们声明为静态,可以不关闭这些实例吗?

4

1 回答 1

1

两个文件都是正确的。

在您提到的第一个文档中,缓存是对象的一个​​字段。如果不关闭缓存close(),Kafka Streams 关闭对应的 RocksDB 状态存储后会泄漏堆外内存,直到 JVM 退出。

第二个文档中,您提到缓存和写缓冲区管理器是静态的。如果您在close()Kafka Streams 关闭的第一个 RocksDB 状态存储中关闭它们,那么所有其他 RocksDB 状态存储很可能会崩溃,因为它们的缓存和写入缓冲区管理器已关闭。

当类被我们没有回调的类加载器卸载时,您需要关闭静态缓存和静态写入缓冲区管理器。我认为卸载会在 JVM 退出时发生,因此在 JVM 退出之前不会泄漏堆外内存,然后无论如何都会释放堆外内存。

关于您关于限制 RocksDB 内存使用的问题,答案取决于您想要限制的内容。您想限制一个 RocksDB 实例使用的内存,还是想限制一个 Kafka Streams 客户端中使用的所有 RocksDB 实例的内存?对于前者,您应该使用第一个文档中的示例。对于后者,您应该使用第二个文档中的示例。

于 2020-12-02T13:56:08.277 回答