希望我已经有了所有混乱的细节,这是有点微妙。
默认情况下,Netty通常会设置io.netty.maxDirectMemory=MaxDirectMemorySize,并在可能的情况下启用“没有更干净的”缓冲区。如果使用的是“没有更干净的”缓冲区,那么Netty的直接内存&Java的“本机”直接内存将被独立地跟踪--因为Netty需要做自己的记帐来跟踪Unsafe.allocateMemory在“needs”缓冲区中分配的内存。
这意味着,在运行默认配置的Netty服务中,为堆外数据预留的理论最大内存通常大致为io.netty.maxDirectMemory+MaxDirectMemorySize -或默认情况下的2 x MaxDirectMemorySize。这是一种悄无声息的记录
所以这很好,即使这有点令人惊讶。
但是,当您试图显式地将io.netty.maxDirectMemory和MaxDirectSize设置为不同的值时,事情似乎变得有点奇怪。例如,我们试图稍微控制一下理论内存上限,以便与cgroup保持良好关系:问题中的服务被OOM杀死了,所以我们变得有点咄咄逼人,一旦我们意识到MDMS/i.n.mdm之间的关系,就会明确设置MaxDirectMemorySize和io.netty.maxDirectMemory来最小化我们的上限-- -XX:MaxDirectMemorySize=1g和set -Dio.netty.maxDirectMemory=3221225472都启用了“没有更干净”的直接缓冲区。
对于Netty来说,我认为这实际上是一个没有操作的更改,因为我们在显式设置-XX:MaxDirectMemorySize=3g之前就已经有了io.netty.maxDirectMemory。然而,我们观察到大量使用中的直接内存报告。我怀疑这可能与缩小的MaxDirectMemory大小有关,我最终发现了这一点,我认为这可以解释两者之间的差异。
为什么在这里使用PlatformDependent.maxDirectMemory() (它将被设置为MaxDirectMemorySize的值而不是推断的io.netty.maxDirectMemory),而不是使用DIRECT_MEMORY_LIMIT (它被设置为io.netty.maxDirectMemory的显式或推断值)?
这可能是我一直误解了一些东西,我不一定是抱怨,只是试图理解:这是有意的行为吗?疏忽/错误?一些很难改变的东西,因为人们现在依赖于现有的语义?还有别的吗?
发布于 2018-11-01 08:12:20
那是个虫子..。谢谢你提请我注意,建议的解决办法:
https://stackoverflow.com/questions/53097133
复制相似问题