希望我这里有所有杂乱的细节,有点微妙。
默认情况下,Netty通常会设置io.netty.maxDirectMemory=MaxDirectMemorySize
并在可能的情况下启用“无清除程序”缓冲区。如果使用了“没有清理程序”缓冲区,则将分别跟踪Netty的直接内存和Java的“本机”直接内存-因为Netty需要自己做记帐来跟踪Unsafe.allocateMemory
在“ no cleaner”缓冲区中分配的内存。
这意味着运行默认配置的Netty服务中为堆外数据预留的理论最大内存通常约为io.netty.maxDirectMemory+MaxDirectMemorySize
或默认为2 x MaxDirectMemorySize
。这是在这里悄悄记录的:
这很好,即使有点意外。
但是,当您尝试将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大小有关,我最终发现了这一点,我认为这可以解释差异。
为什么在这里使用PlatformDependent.maxDirectMemory()
(将其设置为MaxDirectMemorySize
的值,而不是推断的io.netty.maxDirectMemory
)而不是例如DIRECT_MEMORY_LIMIT
(哪个设置为io.netty.maxDirectMemory
的显式或推断值)?
在整个过程中,我可能会误解了一些东西,而我并不一定会抱怨,只是试图理解:这是预期的行为吗?疏忽/错误?因为人们现在依赖于现有的语义,所以很难更改某些东西吗?还有吗?