早上好。
Netty是byteBuffer在官方网站上的描述部分。
如果分配了java.nio.ByteBuffer,它的内容将被0填充。这种“零化”会消耗CPU周期和内存带宽。零化通常是不好的,因为缓冲区通常是从某些数据源立即填充的。
在本节中分配时,没有证据表明内容被零填充,并消耗CPU周期和内存带宽。
事实上,在Eclipse中,我们分配了一个byteBuffer,没有给出任何值,因此我们已经确认所有值都填充了零。但是通常,int a [] = new 5;如果您这样声明它,那么这个索引在所有索引中都是0,我认为这个部分也会消耗CPU和内存。也是int a;我认为仅声明就会消耗内存。
我不知道为什么ByteBuffer的零化是一个致命的问题,因为我觉得自己毕竟是一个ByteBuffer或数组。如果你知道,请回答。
发布于 2018-01-21 11:42:25
来自java规范
数组初始化程序创建数组,并为其所有组件提供初始值。
这意味着Java将始终填充零的ByteBuffer (ByteBuffer中的数组),因为规范中的DirectByteBuffer和HeapByteBuffer都需要这样做。例如,在DirectByteBuffer中可以找到下一行:
unsafe.setMemory(base, size, (byte) 0);对于常规数组的创建:
new byte[size];JVM将这样做(或编译器)。
默认情况下,Netty使用对象池方法。这意味着,当netty为您分配ByteBuf时-它实际上只是从对象池中获取现有的ByteBuf,并标记该缓冲区的writer/reader索引和capacity,因此您总是只根据写入器/读取器索引和容量对放入该缓冲区的实际数据进行操作。在该流程中没有“填充零操作”。
但是,如果您使用的是非池堆字节缓冲区(而不是零),那么就会发生实际情况,比如默认的ByteBuffer。
零不是致命的操作,但是,如果你想获得最大的性能-消除零点是非常重要的。
这是的好文章解释了归零对数组分配性能的影响(提示
https://stackoverflow.com/questions/48359789
复制相似问题