希望我已經(jīng)掌握了所有雜亂的細(xì)節(jié),這有點(diǎn)微妙。默認(rèn)情況下,io.netty.maxDirectMemory=MaxDirectMemorySize如果可能,Netty 通常會(huì)設(shè)置并啟用“無清理器”緩沖區(qū)。如果使用“無清理器”緩沖區(qū),Netty 的直接內(nèi)存和 Java 的“本機(jī)”直接內(nèi)存將被獨(dú)立跟蹤——因?yàn)?Netty 需要自己計(jì)算以跟蹤Unsafe.allocateMemory“無清理器”緩沖區(qū)中分配的內(nèi)存。這意味著在運(yùn)行默認(rèn)配置的 Netty 服務(wù)中為堆外數(shù)據(jù)預(yù)留的理論最大內(nèi)存通常是粗略的io.netty.maxDirectMemory+MaxDirectMemorySize——或者2 x MaxDirectMemorySize默認(rèn)情況下。這是一種悄悄地記錄在這里:https://github.com/netty/netty/blob/6cebb6069b3f30eedaddb12d2d22a6dd66277047/common/src/main/java/io/netty/util/internal/PlatformDependent.java#L132-L139所以這很好,即使它有點(diǎn)令人驚訝。但是當(dāng)您嘗試將 io.netty.maxDirectMemory 和 MaxDirectSize 顯式設(shè)置為不同的值時(shí),事情似乎變得有點(diǎn)奇怪。例如,我們?cè)噲D縮小我們的理論內(nèi)存上限,以便與 cgroups 配合使用:所討論的服務(wù)被 OOM 殺死,所以我們變得有點(diǎn)激進(jìn),一旦我們意識(shí)到 MDMS/inmdm 之間的關(guān)系,設(shè)置 MaxDirectMemorySize和 io.netty.maxDirectMemory 顯式地最小化我們的上限——-XX:MaxDirectMemorySize=1g并設(shè)置-Dio.netty.maxDirectMemory=3221225472為啟用“無清潔器”直接緩沖區(qū)。我預(yù)計(jì)就 Netty 而言,這實(shí)際上是一個(gè)無操作更改,因?yàn)槲覀?XX:MaxDirectMemorySize=3g在明確設(shè)置io.netty.maxDirectMemory. 但是,我們觀察到報(bào)告的使用中直接內(nèi)存大大減少。懷疑它可能與減小的 MaxDirectMemory 大小有關(guān),我最終發(fā)現(xiàn)了這一點(diǎn),我認(rèn)為這可以解釋差異。https://github.com/netty/netty/blob/6cebb6069b3f30eedaddb12d2d22a6dd66277047/buffer/src/main/java/io/netty/buffer/PooledByteBufAllocator.java#L92-L97為什么要使用PlatformDependent.maxDirectMemory()這里(這將被設(shè)置為值MaxDirectMemorySize而不是推斷io.netty.maxDirectMemory),而不是如DIRECT_MEMORY_LIMIT(其被設(shè)置為顯式或推測(cè)值io.netty.maxDirectMemory)?一路上我可能誤解了一些東西,我不一定要抱怨,只是想了解:這是預(yù)期的行為嗎?疏忽/錯(cuò)誤?因?yàn)槿藗儸F(xiàn)在依賴現(xiàn)有的語義而難以改變的東西?還有什么?
為什么 DEFAULT_NUM_DIRECT_ARENA 派生自 PlatformDependent
慕無忌1623718
2021-12-22 18:52:02