首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PooledUnsafeDirectByteBuf在DirectMemory中找不到

PooledUnsafeDirectByteBuf在DirectMemory中找不到
EN

Stack Overflow用户
提问于 2018-06-20 05:36:02
回答 2查看 2.1K关注 0票数 0

我正在使用Netty 4.1.17-决赛。

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

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

因此,Netty缓冲区为100 MB,但即使通过监视直接内存也找不到它。

代码语言:javascript
复制
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,但是在哪里缓冲接收到的数据呢?还是直接缓冲区监视方法不正确?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-20 08:22:50

您可以告诉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

票数 2
EN

Stack Overflow用户

发布于 2018-06-20 07:17:52

自答,在我的代码中,Netty已经使用com.sun.Unsafe获得了com.sun.Unsafe。该区域不能用BufferPoolMXBean或SharedSecrets捕获。

我试图用不安全的方式获取内存,但没有输出到监视结果。

代码语言:javascript
复制
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
unsafe.allocateMemory(1000);

我发现了以下请求。

用于跟踪堆外内存的扩展,用于netty .问题#475 . Netflix/spectator

请告诉我是否有办法得到不安全的尺寸。

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

https://stackoverflow.com/questions/50940929

复制
相关文章

相似问题

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