为什么DEFAULT_NUM_DIRECT_ARENA是从PlatformDependent.maxDirectMemory()派生的?

时间:2018-11-01 07:52:15

标签: java netty

希望我这里有所有杂乱的细节,有点微妙。

默认情况下,Netty通常会设置io.netty.maxDirectMemory=MaxDirectMemorySize并在可能的情况下启用“无清除程序”缓冲区。如果使用了“没有清理程序”缓冲区,则将分别跟踪Netty的直接内存和Java的“本机”直接内存-因为Netty需要自己做记帐来跟踪Unsafe.allocateMemory在“ no cleaner”缓冲区中分配的内存。

这意味着运行默认配置的Netty服务中为堆外数据预留的理论最大内存通常约为io.netty.maxDirectMemory+MaxDirectMemorySize或默认为2 x MaxDirectMemorySize。这是在这里悄悄记录的:

https://github.com/netty/netty/blob/6cebb6069b3f30eedaddb12d2d22a6dd66277047/common/src/main/java/io/netty/util/internal/PlatformDependent.java#L132-L139

这很好,即使有点意外。

但是,当您尝试将io.netty.maxDirectMemory和MaxDirectSize显式设置为不同的值时,事情似乎变得有些奇怪。例如,我们试图稍微降低理论内存上限,以便与cgroup配合使用:有问题的服务被OOM杀死,因此我们变得有点攻击性,并且一旦意识到MDMS / inmdm之间的关系,就设置MaxDirectMemorySize和io.netty.maxDirectMemory显式地最小化我们的上限--XX:MaxDirectMemorySize=1g并设置-Dio.netty.maxDirectMemory=3221225472并启用了“没有更清洁”的直接缓冲区。

我希望就Netty而言,这实际上是无人值守的更改,因为在显式设置-XX:MaxDirectMemorySize=3g之前我们有io.netty.maxDirectMemory。但是,我们观察到使用中的直接记忆报告大大减少。怀疑它可能与减小的MaxDirectMemory大小有关,我最终发现了这一点,我认为这可以解释差异。

https://github.com/netty/netty/blob/6cebb6069b3f30eedaddb12d2d22a6dd66277047/buffer/src/main/java/io/netty/buffer/PooledByteBufAllocator.java#L92-L97

为什么在这里使用PlatformDependent.maxDirectMemory()(将其设置为MaxDirectMemorySize的值,而不是推断的io.netty.maxDirectMemory)而不是例如DIRECT_MEMORY_LIMIT(哪个设置为io.netty.maxDirectMemory的显式或推断值)?

在整个过程中,我可能会误解了一些东西,而我并不一定会抱怨,只是试图理解:这是预期的行为吗?疏忽/错误?因为人们现在依赖于现有的语义,所以很难更改某些东西吗?还有吗?

1 个答案:

答案 0 :(得分:4)

那是一个错误。...感谢您引起我的注意,提出了解决方案:

https://github.com/netty/netty/pull/8452