关于finalize机制和引用、引用队列的用法详解
C++有析构函数这个东西,能够很好地在对象销毁前做一些释放外部资源的工作,但是java没有。Object.finalize()提供了与析构函数类似的机制,但是它不安全、会导致严重的内存消耗和性能降低,应该避免使用。best practice是:像java类库的IO流、数据库连接、socket一样,提供显示的资源释放接口,程序员使用完这些资源后,必须要显示释放。所以可以忘记Object.finalize()的存在。JVM启动的时候,会创建一个Finalizer线程来支持finalize方法的执行。
关于引用和引用队列,java提供了4种引用类型,在垃圾回收的时候,都有自己各自的独特表现。ReferenceQueue是用来配合引用工作的,没有ReferenceQueue一样可以运行。创建引用的时候可以指定关联的队列,当GC释放对象内存的时候,会将引用加入到引用队列,这相当于是一种通知机制。当关联的引用队列中有数据的时候,意味着引用指向的堆内存中的对象被回收。通过这种方式,JVM允许我们在对象被销毁后,做一些我们自己想做的事情。JVM提供了一个ReferenceHandler线程,将引用加入到注册的引用队列中。
finalze机制是先执行Object.finalize()中的逻辑,后销毁堆中的对象;引用和队列机制,先销毁对象,后执行我们自己的逻辑。可以看到:使用引用和队列机制效率更高,因为垃圾对象释放的速度更快。如果是监控对象的销毁,那么最适合的是幽灵引用,如sun.misc.Cleaner就是使用幽灵引用,达到监控对象销毁的目的,NIO中使用的就是这个。
以上这篇关于finalize机制和引用、引用队列的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
上一篇:解决C#中Linq GroupBy 和OrderBy失效的方法
栏 目:C#教程
本文标题:关于finalize机制和引用、引用队列的用法详解
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/6258.html
您可能感兴趣的文章
- 01-10关于ASP网页无法打开的解决方案
- 01-10关于nancy中的身份验证
- 01-10C#开发中的垃圾回收机制简析
- 01-10C#中ZipHelper 压缩和解压帮助类
- 01-10详解C#中的定时器Timer类及其垃圾回收机制
- 01-10关于C#中排序函数的总结
- 01-10关于C# Math 处理奇进偶不进的实现代码
- 01-10C#中的委托使用
- 01-10浅谈C#多线程简单例子讲解
- 01-10关于C#中ajax跨域访问问题
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10C#中split用法实例总结
- 04-02jquery与jsp,用jquery
- 01-10SublimeText编译C开发环境设置
- 01-10delphi制作wav文件的方法
- 01-11ajax实现页面的局部加载
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文