Jdk Nio Api 文档地址:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/package-summary.html
- 核心类和接口
- Buffer
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/package-summary.html#buffers - Channel
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/channels/package-summary.html - Selector
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/channels/Selector.html - SelectionKey
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/channels/SelectionKey.html
- ByteBuffer
基本类型数据的容器,对数组的包装
直接内存和堆内存
直接内存的分配和回收
public static void buffer() {
final ByteBuffer byteBuffer = ByteBuffer.allocateDirect(32);
}
java.nio.DirectByteBuffer
DirectByteBuffer(int cap) {
// ...
// 累计申请直接内存大小,判断否达到最大值
Bits.reserveMemory(size, cap);
long base = 0;
try {
// 分配直接内存,返回内存首地址
base = UNSAFE.allocateMemory(size);
} catch (OutOfMemoryError x) {
// 减少累计直接内存大小统计
Bits.unreserveMemory(size, cap);
throw x;
}
// 通过 PhantomReference 在该对象 GC 时,释放直接内存
cleaner = Cleaner.create(this, new Deallocator(base, size, cap));
}
Deallocator
public void run() {
// ...
// 释放直接内存
UNSAFE.freeMemory(address);
// 减少累计直接内存大小统计
Bits.unreserveMemory(size, capacity);
}
网友评论