BsonChunkPool 和内存泄漏

BsonChunkPool and memory leak

我使用 Mongodb 3.6 + .net 驱动程序 (MongoDb.Driver 2.10) 来管理我们的数据。最近,我们注意到我们的服务(后台)消耗了大量内存。对转储进行分析后,发现有一个名为 BsonChunkPool 的 mongo 对象总是消耗大约 0.5 GB 的内存。正常吗?我真的找不到关于这种类型及其实际作用的任何有价值的文档。有人可以帮忙吗?

BsonChunkPool 的存在是为了可以重复使用大内存缓冲区(块),从而减轻垃圾收集器必须完成的工作量。

最初池是空的,但随着缓冲区返回到池中,池不再是空的。池中的任何内存都不会被垃圾回收。这是设计使然。该内存旨在重复使用。这不是内存泄漏。

BsonChunkPool 的默认配置是它最多可以容纳 8192 个块,每个块大小为 64KB,因此如果池增长到其最大大小,它将使用 512MB 的内存(甚至更多比您观察到的 7 或 35 MB)。

如果出于某种原因您不希望 BsonChunkPool 使用那么多内存,您可以通过在应用程序的开头放置以下语句来进行不同的配置:

BsonChunkPool.Default = new BsonChunkPool(16, 64 * 1024); // e.g. max 16 chunks of 64KB each, for a total of 1MB

我们还没有尝试过不同的块数和大小值,因此如果您决定更改默认 BsonChunkPool 配置,您应该进行一些基准测试并验证它不会对你的表现。

来自 jira: