0%

java | bytebuf 简介

bytebuf 是可以扩容的。

可扩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.redisc;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;


@Slf4j
public class Run {

public static void main(String[] args) throws IOException {
ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); // 默认长度 256
System.out.println(byteBuf);

StringBuilder s = new StringBuilder();
for (int i = 0; i < 300; i++) {
s.append(i);
}

byteBuf.writeBytes(s.toString().getBytes());
System.out.println(byteBuf);
}

}

输出

1
2
PooledUnsafeDirectByteBuf(ridx: 0, widx: 0, cap: 256)
PooledUnsafeDirectByteBuf(ridx: 0, widx: 790, cap: 1024)

直接内存和堆内存

直接内存创建和销毁代价大,但是,读写效率高,适合配合池化一起用。

直接内存对 GC 压力小,因为垃圾不回收,但是要注意及时释放。

基于堆的池化

ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer();

基于直接内存的池化

ByteBuf byteBuf = ByteBufAllocator.DEFAULT.directBuffer(); 

池化 & 非池化

池化的最大意义可以重复使用 ByteBuf

  • 没有池化,每次需要创建新的 ByteBuf 的实例
  • 有了池化,可以重用池中 ByteBuf 的实例
  • 高并发时,节约内存,减少溢出

netty4.1 之前池化并不成熟,4.1 之后默认是开启的。「Android 4.1 之后默认是关闭的」

关闭池化需要通过程序开启时传递参数做到,这里不再说明。

请我喝杯咖啡吧~