首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ByteBuffer零化?

ByteBuffer零化?
EN

Stack Overflow用户
提问于 2018-01-20 18:39:52
回答 1查看 1.7K关注 0票数 0

早上好。

Netty是byteBuffer在官方网站上的描述部分。

如果分配了java.nio.ByteBuffer,它的内容将被0填充。这种“零化”会消耗CPU周期和内存带宽。零化通常是不好的,因为缓冲区通常是从某些数据源立即填充的。

在本节中分配时,没有证据表明内容被零填充,并消耗CPU周期和内存带宽。

事实上,在Eclipse中,我们分配了一个byteBuffer,没有给出任何值,因此我们已经确认所有值​​都填充了零。但是通常,int a [] = new 5;如果您这样声明它,那么这个索引在所有索引中都是0,我认为这个部分也会消耗CPU和内存。也是int a;我认为仅声明就会消耗内存。

我不知道为什么ByteBuffer的零化是一个致命的问题,因为我觉得自己毕竟是一个ByteBuffer或数组。如果你知道,请回答。

EN

回答 1

Stack Overflow用户

发布于 2018-01-21 11:42:25

来自java规范

数组初始化程序创建数组,并为其所有组件提供初始值。

这意味着Java将始终填充零的ByteBuffer (ByteBuffer中的数组),因为规范中的DirectByteBufferHeapByteBuffer都需要这样做。例如,在DirectByteBuffer中可以找到下一行:

代码语言:javascript
复制
unsafe.setMemory(base, size, (byte) 0);

对于常规数组的创建:

代码语言:javascript
复制
new byte[size];

JVM将这样做(或编译器)。

默认情况下,Netty使用对象池方法。这意味着,当netty为您分配ByteBuf时-它实际上只是从对象池中获取现有的ByteBuf,并标记该缓冲区的writer/reader索引和capacity,因此您总是只根据写入器/读取器索引和容量对放入该缓冲区的实际数据进行操作。在该流程中没有“填充零操作”。

但是,如果您使用的是非池堆字节缓冲区(而不是零),那么就会发生实际情况,比如默认的ByteBuffer

零不是致命的操作,但是,如果你想获得最大的性能-消除零点是非常重要的。

这是的好文章解释了归零对数组分配性能的影响(提示

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

https://stackoverflow.com/questions/48359789

复制
相关文章

相似问题

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