首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么DEFAULT_NUM_DIRECT_ARENA是从PlatformDependent.maxDirectMemory()派生的?

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

Stack Overflow用户
提问于 2018-11-01 07:52:15
回答 1查看 930关注 0票数 4

希望我已经有了所有混乱的细节,这是有点微妙。

默认情况下,Netty通常会设置io.netty.maxDirectMemory=MaxDirectMemorySize,并在可能的情况下启用“没有更干净的”缓冲区。如果使用的是“没有更干净的”缓冲区,那么Netty的直接内存&Java的“本机”直接内存将被独立地跟踪--因为Netty需要做自己的记帐来跟踪Unsafe.allocateMemory在“needs”缓冲区中分配的内存。

这意味着,在运行默认配置的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/i.n.mdm之间的关系,就会明确设置MaxDirectMemorySize和io.netty.maxDirectMemory来最小化我们的上限-- -XX:MaxDirectMemorySize=1g和set -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的显式或推断值)?

这可能是我一直误解了一些东西,我不一定是抱怨,只是试图理解:这是有意的行为吗?疏忽/错误?一些很难改变的东西,因为人们现在依赖于现有的语义?还有别的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-01 08:12:20

那是个虫子..。谢谢你提请我注意,建议的解决办法:

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53097133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档