gpt4 book ai didi

java - 在 DirectMemory 中找不到 PooledUnsafeDirectByteBuf

转载 作者:行者123 更新时间:2023-12-02 11:06:11 24 4
gpt4 key购买 nike

我使用的是 Netty 4.1.17-Final。

我编写了发送和接收 100 MB 随机 ASCII 的代码。直到 ByteBuf 达到 100 MB 时,解码器才会读取。

@Override
public void decode(ByteBuffer _in, List<Object> _out) {
if (_in.remaining() == size) { // size = 100 * 1024 * 1024
_in.get(new byte[size]);
}
}

因此,Netty缓冲了100MB,但是通过监控Direct Memory也没有发现。

System.out.println(sun.misc.SharedSecrets.getJavaNioAccess().getDirectBufferPool().getMemoryUsed());
ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class).forEach(buf -> {
System.out.printf("%s: Used=%d, TotalCap=%d%n", buf.getName(), buf.getMemoryUsed(), buf.getTotalCapacity());
});

// Result
// 10
// direct: Used=9, TotalCap=8
// mapped: Used=0, TotalCap=0

Netty使用了PooledUnsafeDirectByteBuf,但是你在哪里缓冲接收到的数据呢?还是直接缓冲区监控方法不正确?

最佳答案

您可以告诉 Netty 不要对直接缓冲区使用 Unsafe,这样它就会再次显示在 JMX 中。不幸的是,这也会产生一些性能影响。

只需使用-Dio.netty.maxDirectMemory=0

参见:https://github.com/netty/netty/blob/4.1/common/src/main/java/io/netty/util/internal/PlatformDependent.java#L153

关于java - 在 DirectMemory 中找不到 PooledUnsafeDirectByteBuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50940929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com