Netty ByteBuffer归零?

Netty ByteBuffer归零?,netty,bytebuffer,Netty,Bytebuffer,早上好 Netty是byteBuffer在官方网站上的描述部分 如果分配了java.nio.ByteBuffer,则其内容将填充0。这种“归零”会消耗CPU周期和内存带宽。 归零通常不好,因为缓冲区通常会立即从某些数据源填充。” 当在本节中分配时,没有证据表明内容已用零填充并消耗CPU周期和内存带宽 事实上,在Eclipse中,我们已经分配了一个byteBuffer,并且没有给出任何值,所以我们已经确认所有的值​​都用零填充。 但一般来说,int a[]=新int[5];如果你这样声明,这个索引

早上好

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

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

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

事实上,在Eclipse中,我们已经分配了一个byteBuffer,并且没有给出任何值,所以我们已经确认所有的值​​都用零填充。 但一般来说,int a[]=新int[5];如果你这样声明,这个索引在所有索引中都是0,我认为这个部分也会消耗CPU和内存。 还包括INTA;我认为仅仅是声明就消耗了内存

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

来自:

数组初始值设定项创建数组并为 它的所有组成部分

这意味着Java虚拟机将始终填充零的
ByteBuffer
(内部数组
ByteBuffer
),用于
DirectByteBuffer
HeapByteBuffer
,这是规范要求的。例如,在
DirectByteBuffer
中,您可以找到下一行:

unsafe.setMemory(base, size, (byte) 0);
对于常规数组的创建:

new byte[size];
JVM(或编译器)将这样做

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

但是,如果您使用的是未冷却的堆字节缓冲区,那么实际上会发生归零,就像在默认的Java
ByteBuffer
中一样

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

这篇文章很好地解释了归零对阵列分配性能的影响程度(提示-在大型阵列上大约慢15倍)。

来自:

数组初始值设定项创建数组并为 它的所有组成部分

这意味着Java虚拟机将始终填充零的
ByteBuffer
(内部数组
ByteBuffer
),用于
DirectByteBuffer
HeapByteBuffer
,这是规范要求的。例如,在
DirectByteBuffer
中,您可以找到下一行:

unsafe.setMemory(base, size, (byte) 0);
对于常规数组的创建:

new byte[size];
JVM(或编译器)将这样做

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

但是,如果您使用的是未冷却的堆字节缓冲区,那么实际上会发生归零,就像在默认的Java
ByteBuffer
中一样

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

这是一篇很好的文章,解释了归零对阵列分配性能的影响程度(提示-在大型阵列上大约慢15倍)