我现在正在玩一个定制的游戏 RocksDB
通过扩展 RocksDBConfigSetter
接口。我看到了关于结案的相互矛盾的文件 cache
& writeBufferManager
示例。
现在,我看到javadoc&其中一个文档页面建议我们需要关闭所有扩展的示例 RocksObject
(二者) Cache
& WriteBufferManager
示例在重写的 RocksDBConfigSetter#close()
方法。
但是,内存管理文档页建议我们将这些示例创建为静态示例,而不是关闭 Cache
以及 WriteBufferManager
覆盖中的示例 RocksDBConfigSetter#close()
方法。
不知道接下来要做什么。如果有人能帮助我了解哪些文档是正确的,如果我们希望通过传递自定义rocksdb配置来限制内存使用,那么最好的方法是什么。
如果我们将这些示例声明为静态的,是否可以不关闭它们?
1条答案
按热度按时间2w3rbyxf1#
两份文件都是正确的。
在第一个文档中,您提到缓存是对象的一个字段。如果不关闭中的缓存
close()
,它将在kafka streams关闭相应rocksdb状态存储后泄漏堆内存,直到jvm退出。在第二个文档中,您提到缓存和写缓冲区管理器是静态的。如果你把它们关上
close()
kafka streams关闭的第一个rocksdb状态存储将同时关闭,所有其他rocksdb状态存储很可能会崩溃,因为它们的缓存和写入缓冲区管理器已关闭。当类被没有回调的类加载器卸载时,需要关闭静态缓存和静态写缓冲区管理器。我认为卸载是在jvm退出时发生的,因此在jvm退出之前,堆外内存不会泄漏,之后无论如何,堆外内存都会被释放。
关于你关于限制rocksdb内存使用的问题,答案取决于你想要限制什么。是要限制rocksdb的一个示例使用的内存,还是要限制kafka streams客户端中使用的所有rocksdb示例的内存?对于前者,您应该使用第一个文档中的示例。对于后者,您应该使用第二个文档中的示例。