关闭或不关闭kafka streams应用程序中的rocksdb缓存和writebuffermanager

vatpfxk5  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(395)

我现在正在玩一个定制的游戏 RocksDB 通过扩展 RocksDBConfigSetter 接口。我看到了关于结案的相互矛盾的文件 cache & writeBufferManager 示例。
现在,我看到javadoc&其中一个文档页面建议我们需要关闭所有扩展的示例 RocksObject (二者) Cache & WriteBufferManager 示例在重写的 RocksDBConfigSetter#close() 方法。
但是,内存管理文档页建议我们将这些示例创建为静态示例,而不是关闭 Cache 以及 WriteBufferManager 覆盖中的示例 RocksDBConfigSetter#close() 方法。
不知道接下来要做什么。如果有人能帮助我了解哪些文档是正确的,如果我们希望通过传递自定义rocksdb配置来限制内存使用,那么最好的方法是什么。
如果我们将这些示例声明为静态的,是否可以不关闭它们?

2w3rbyxf

2w3rbyxf1#

两份文件都是正确的。
在第一个文档中,您提到缓存是对象的一个字段。如果不关闭中的缓存 close() ,它将在kafka streams关闭相应rocksdb状态存储后泄漏堆内存,直到jvm退出。
在第二个文档中,您提到缓存和写缓冲区管理器是静态的。如果你把它们关上 close() kafka streams关闭的第一个rocksdb状态存储将同时关闭,所有其他rocksdb状态存储很可能会崩溃,因为它们的缓存和写入缓冲区管理器已关闭。
当类被没有回调的类加载器卸载时,需要关闭静态缓存和静态写缓冲区管理器。我认为卸载是在jvm退出时发生的,因此在jvm退出之前,堆外内存不会泄漏,之后无论如何,堆外内存都会被释放。
关于你关于限制rocksdb内存使用的问题,答案取决于你想要限制什么。是要限制rocksdb的一个示例使用的内存,还是要限制kafka streams客户端中使用的所有rocksdb示例的内存?对于前者,您应该使用第一个文档中的示例。对于后者,您应该使用第二个文档中的示例。

相关问题