ByteBuffer归零?

时间:2018-01-20 18:39:52

标签: netty bytebuffer

早上好。

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

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

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

实际上,在Eclipse中我们已经分配了一个byteBuffer并且没有给出任何值,因此我们确认所有值都用零填充。 但通常,int a [] = new int [5];如果你这样声明,这个索引在所有索引中都是0,我认为这部分也消耗CPU和内存。 也是一个;我认为这个宣言本身就会消耗记忆。

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

1 个答案:

答案 0 :(得分:2)

来自java specification

  

数组初始值设定项创建一个数组并为其提供初始值   所有组件。

这意味着,对于ByteBufferByteBuffer,Java VM将始终填充零DirectByteBufferHeapByteBuffer内的数组),因为规范要求。例如,在DirectByteBuffer中,您可以找到下一行:

unsafe.setMemory(base, size, (byte) 0);

和常规数组创建:

new byte[size];

JVM将执行该操作(或编译器)。

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

但是,如果你使用的是Unpooled堆字节缓冲区 - 而不是归零,那么就像在默认的Java ByteBuffer中一样。

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

Here is一篇很好的文章,解释了多少归零可能会影响数组分配的性能(提示 - 在大型数组上慢约15倍)。