DirectByteBuffer 内存申请和回收
2016-12-25 18:58:13 0 举报
登录查看完整内容
DirectByteBuffer 是 Java NIO 中的一个类,它提供了直接内存访问的能力。在 DirectByteBuffer 中,内存的申请和回收都是由虚拟机自动管理的,不需要手动进行操作。当 DirectByteBuffer 对象被创建时,虚拟机会为其分配一段连续的内存空间,用于存储字节数据。当 DirectByteBuffer 对象不再使用时,虚拟机会自动回收其占用的内存空间,避免了内存泄漏的问题。因此,使用 DirectByteBuffer 可以有效地提高程序的性能和稳定性。
作者其他创作
大纲/内容
无空间
Thread
加锁cap 判断是否还有空间-XX:MaxDirectMemorySize指定的最大值
性能消耗由于gc是异步执行,需要等待Thread.sleep(100); 等待100ms
创建DBB 内存分配
DirectByteBuffer
address 虚拟内存地址cleaner Cleaner类
Cleaner
静态ReferenceQueue dummyQueuestatic Cleaner firstCleaner nextCleaner prevRunnable thunk 回收内存线程每一个DBB对应一个Cleaner对象静态first指针维护了一个双向链表,所有cleaner构成这个链表
ReferenceHandler
run()
long base = unsafe.allocateMemory(size);向os申请内存返回首地址
PhantomReference
虚引用
Deallocator
DBB内部类addresssizecapacityunsafe
run()用于回收DBB内存
Reference
referentqueuepending 未??
执行System.gc
reservedMemory += sizetotalCapacity += cap; count++; return;
Unsafe
都是本地方法unsafe.cpp 大多是都是系统调用
allocateMemoryfreeMemory
DirectByteBuffer(int cap)构造计算size
Runnable
ByteBuffer.allocateDirect(length)
Bits
java.nio.Bits处理内存字节类reservedMemory 实际申请的内存maxMemory 最大内存totalCapacity 当前客户申请内存count
unsafe()reserveMemory()
再次判断是否有空间没有 OutOfMemoryError
根据base计算address
有空间
0 条评论
回复 删除
下一页