为什么 DEFAULT_NUM_DIRECT_ARENA 派生自 PlatformDependent.maxDirectMemory()?
Why is DEFAULT_NUM_DIRECT_ARENA derived from PlatformDependent.maxDirectMemory()?
希望我已经把所有乱七八糟的细节都写在这里了,它有点微妙。
默认情况下,Netty 通常会设置 io.netty.maxDirectMemory=MaxDirectMemorySize
并在可能的情况下启用 "no cleaner" 缓冲区。如果 "no cleaner" 缓冲区正在使用中,Netty 的直接内存和 Java 的 "native" 直接内存将被独立跟踪——因为 Netty 需要自己进行统计以跟踪由 [=13] 分配的内存=] 在 "no cleaner" 个缓冲区中。
这意味着在 Netty 服务 运行 默认配置中为堆外数据预留的理论最大内存通常大致为 io.netty.maxDirectMemory+MaxDirectMemorySize
—— 或默认为 2 x MaxDirectMemorySize
。这有点悄悄地记录在这里:
所以这很好,即使有点令人惊讶。
但是当您尝试将 io.netty.maxDirectMemory 和 MaxDirectSize 显式设置为不同的值时,事情似乎变得有点奇怪。例如,我们试图稍微降低我们的理论内存上限,以便与 cgroups 一起玩:有问题的服务正在被 OOM 杀死,所以我们变得有点激进,一旦我们意识到 MDMS/i 之间的关系。 n.mdm,明确设置 MaxDirectMemorySize 和 io.netty.maxDirectMemory 以最小化我们的上限 -- -XX:MaxDirectMemorySize=1g
并设置 -Dio.netty.maxDirectMemory=3221225472
并启用 "no cleaner" 直接缓冲区。
就 Netty 而言,我预计这实际上是一个无操作更改,因为在我们明确设置 io.netty.maxDirectMemory
之前我们有 -XX:MaxDirectMemorySize=3g
。但是,我们观察到报告的正在使用的直接内存大大减少。怀疑它可能与减小的 MaxDirectMemory 大小有关,我最终发现了这一点,我认为这可以解释差异。
为什么在这里使用 PlatformDependent.maxDirectMemory()
(它将被设置为 MaxDirectMemorySize
的值而不是推断的 io.netty.maxDirectMemory
)而不是例如DIRECT_MEMORY_LIMIT
(其中 是 设置为 io.netty.maxDirectMemory
的显式或推断值)?
有可能我在整个过程中误解了某些东西,我不一定要抱怨,只是想了解:这是有意为之的行为吗?一个oversight/bug?由于人们现在依赖现有的语义而难以改变的东西?还有别的吗?
这是一个错误....感谢您提醒我,建议修复:
希望我已经把所有乱七八糟的细节都写在这里了,它有点微妙。
默认情况下,Netty 通常会设置 io.netty.maxDirectMemory=MaxDirectMemorySize
并在可能的情况下启用 "no cleaner" 缓冲区。如果 "no cleaner" 缓冲区正在使用中,Netty 的直接内存和 Java 的 "native" 直接内存将被独立跟踪——因为 Netty 需要自己进行统计以跟踪由 [=13] 分配的内存=] 在 "no cleaner" 个缓冲区中。
这意味着在 Netty 服务 运行 默认配置中为堆外数据预留的理论最大内存通常大致为 io.netty.maxDirectMemory+MaxDirectMemorySize
—— 或默认为 2 x MaxDirectMemorySize
。这有点悄悄地记录在这里:
所以这很好,即使有点令人惊讶。
但是当您尝试将 io.netty.maxDirectMemory 和 MaxDirectSize 显式设置为不同的值时,事情似乎变得有点奇怪。例如,我们试图稍微降低我们的理论内存上限,以便与 cgroups 一起玩:有问题的服务正在被 OOM 杀死,所以我们变得有点激进,一旦我们意识到 MDMS/i 之间的关系。 n.mdm,明确设置 MaxDirectMemorySize 和 io.netty.maxDirectMemory 以最小化我们的上限 -- -XX:MaxDirectMemorySize=1g
并设置 -Dio.netty.maxDirectMemory=3221225472
并启用 "no cleaner" 直接缓冲区。
就 Netty 而言,我预计这实际上是一个无操作更改,因为在我们明确设置 io.netty.maxDirectMemory
之前我们有 -XX:MaxDirectMemorySize=3g
。但是,我们观察到报告的正在使用的直接内存大大减少。怀疑它可能与减小的 MaxDirectMemory 大小有关,我最终发现了这一点,我认为这可以解释差异。
为什么在这里使用 PlatformDependent.maxDirectMemory()
(它将被设置为 MaxDirectMemorySize
的值而不是推断的 io.netty.maxDirectMemory
)而不是例如DIRECT_MEMORY_LIMIT
(其中 是 设置为 io.netty.maxDirectMemory
的显式或推断值)?
有可能我在整个过程中误解了某些东西,我不一定要抱怨,只是想了解:这是有意为之的行为吗?一个oversight/bug?由于人们现在依赖现有的语义而难以改变的东西?还有别的吗?
这是一个错误....感谢您提醒我,建议修复: