堆外内存DirectByteBuffer剖析
来源:互联网 发布:java 计算时间的差 编辑:程序博客网 时间:2024/05/16 07:24
操作系统中除了jvm申请的内存外,还有一块jvm以外的内存,这块内存空间一船是连续的,DirectByteBuffer对象是在jvm申请和创建的,内容是在堆外内存存放的的,DirectByteBuffer保存申请堆外内存时的起始偏移地址和堆外内存申请的容量。
java.nio.DirectByteBuffer源码包含了这些类:
Bits:记录申请堆外内存的大小及创建Unsafe对象
Unsafe:申请堆外内存和销毁堆外内存
Deallocator:堆外内存回收线程
Cleaner: Cleaner.create()需要2个参数:第一个参数:需要监控的堆内存对象DirectByteBuffer,第二个参数:程序释放资源的回调Deallocator。当JVM进行GC的时候,如果发现我们监控的对象,不存在强引用了(只被Cleaner对象引用,这是个幽灵引用),就会调用第二个参数Deallocator.run()方法的逻辑,执行完Deallocator.run()的时候(这个时候已经释放了堆外内存),JVM会自动释放堆内存中我们监控的对象。
申请堆外内存步骤:
1. 调用unsafe.allocateMemory申请堆外内存并获得起始地址偏移量
2. 调用unsafe.setMemory始初化堆外内存数据为0
3. 调用Bits.reserveMemory保存申请的堆外内存的数量
4. 初始化Cleaner对象,传入回调线程Deallocator
回收逻辑是在Deallocator.run方法里:
1. 调用unsafe.freeMemory释放内存
2. 调用Bits.unreserveMemory减少堆外内存的数量
- 堆外内存DirectByteBuffer剖析
- 堆外内存之DirectByteBuffer
- 堆外内存之 DirectByteBuffer 详解
- Java NIO学习笔记三(堆外内存之 DirectByteBuffer 详解)
- DirectByteBuffer内存申请与释放
- DirectByteBuffer
- DirectByteBuffer
- NIO DirectByteBuffer 内存泄露的测试
- java学习-【转】NIO DirectByteBuffer 内存泄露的测试
- 堆内内存还是堆外内存?
- 堆内存和堆外内存
- 剖析程序中的栈与堆的内存分配
- C语言:函数堆内存分配问题剖析
- 使用堆外内存
- 使用堆外内存
- 使用堆外内存
- Java堆外内存
- 使用堆外内存
- CSS3 Object-fit和Object-position
- Expected response code 220 but got code “”, with message “””
- 线性代数mooc课(3)
- 代理模式
- Python yield与实现
- 堆外内存DirectByteBuffer剖析
- 2017跟着小虎玩着去软考--趣味好玩解析2015年下半年信息系统项目管理师上午试题46-50题
- 我用过和未用过的浏览器
- CList类的GetNext函数
- jvm内存区
- VS2013的Release模式下进行调试
- 26.读-写锁 ReadWriteLock
- xp连接VPN错误提示: vpn连接出错789:L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误。
- Cocoapods的安装和使用