希望我已经掌握了所有杂乱的细节,这有点微妙。
默认情况下,io.netty.maxDirectMemory=MaxDirectMemorySize
如果可能,Netty 通常会设置并启用“无清理器”缓冲区。如果使用“无清理器”缓冲区,Netty 的直接内存和 Java 的“本机”直接内存将被独立跟踪——因为 Netty 需要自己计算以跟踪Unsafe.allocateMemory
“无清理器”缓冲区中分配的内存。
这意味着在运行默认配置的 Netty 服务中为堆外数据预留的理论最大内存通常是粗略的io.netty.maxDirectMemory+MaxDirectMemorySize
——或者2 x MaxDirectMemorySize
默认情况下。这是一种悄悄地记录在这里:
所以这很好,即使它有点令人惊讶。
但是当您尝试将 io.netty.maxDirectMemory 和 MaxDirectSize 显式设置为不同的值时,事情似乎变得有点奇怪。例如,我们试图缩小我们的理论内存上限,以便与 cgroups 配合使用:所讨论的服务被 OOM 杀死,所以我们变得有点激进,一旦我们意识到 MDMS/inmdm 之间的关系,设置 MaxDirectMemorySize和 io.netty.maxDirectMemory 显式地最小化我们的上限——-XX:MaxDirectMemorySize=1g
并设置-Dio.netty.maxDirectMemory=3221225472
为启用“无清洁器”直接缓冲区。
我预计就 Netty 而言,这实际上是一个无操作更改,因为我们-XX:MaxDirectMemorySize=3g
在明确设置io.netty.maxDirectMemory
. 但是,我们观察到报告的使用中直接内存大大减少。怀疑它可能与减小的 MaxDirectMemory 大小有关,我最终发现了这一点,我认为这可以解释差异。
为什么要使用PlatformDependent.maxDirectMemory()
这里(这将被设置为值MaxDirectMemorySize
而不是推断io.netty.maxDirectMemory
),而不是如DIRECT_MEMORY_LIMIT
(其被设置为显式或推测值io.netty.maxDirectMemory
)?
一路上我可能误解了一些东西,我不一定要抱怨,只是想了解:这是预期的行为吗?疏忽/错误?因为人们现在依赖现有的语义而难以改变的东西?还有什么?
叮当猫咪
相关分类