
在Sun
JDK中,由
java.nio.DirectByteBuffer创建的
ByteBuffer#allocateDirect(int)a具有类型字段
sun.misc.Cleaner,该字段扩展为
java.lang.ref.PhantomReference。
当此
Cleaner(记住,是的子类型
PhantomReference)被收集并即将移入关联时
ReferenceQueue,通过嵌套类型运行的与集合相关的线程
ReferenceHandler对
Cleaner实例进行特殊处理:它向下转换并调用
Cleaner#clean(),最终使它返回进行调用
DirectByteBuffer$Deallocator#run(),依次进行调用
Unsafe#freeMemory(long)。哇。
这相当circuit回,我很惊讶没有看到游戏中的任何使用
Object#finalize()。Sun开发人员必须将其原因归结到更靠近收集和参考管理子系统的地方。
简而言之,
DirectByteBuffer只要垃圾回收器有机会注意到这种放弃,并且其引用处理线程通过上述调用取得了进展,就不会因为放弃引用实例而耗尽内存。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)