当前位置: 首页 > 编程笔记 >

关于finalize机制和引用、引用队列的用法详解

充普松
2023-03-14
本文向大家介绍关于finalize机制和引用、引用队列的用法详解,包括了关于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机制和引用、引用队列的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 我最近在研究java函数界面,想知道方法参考是如何在收集流方法上工作的。 在java留档上,收集方法得到3个参数:供应商、累加器和组合器。 ...这是示例代码。 所以,我的问题是: > 参数类型 正如您在上面的代码中看到的,收集方法接收Bi消费者接口作为累加器和组合器的参数。 但是,ArrayList::add和ArrayList::addAll方法只接受一个参数(不是“Bi”,而是“一元”!)。

  • 本文向大家介绍Python参数传递机制传值和传引用原理详解,包括了Python参数传递机制传值和传引用原理详解的使用技巧和注意事项,需要的朋友参考一下 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思?    函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。   值传递(passl-by-val

  • 本文向大家介绍Android 软引用和弱引用详解及实例代码,包括了Android 软引用和弱引用详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 Android 软引用 和 弱引用        1.  SoftReference<T>:软引用-->当虚拟机内存不足时,将会回收它指向的对象;需要获取对象时,可以调用get方法。     2.  WeakReference<T>:弱引用-->随

  • 如果重写finalize()并引用一个对象会发生什么。那个对象会被垃圾回收吗?从内存中清除该对象的另一种方法是什么?

  • 我错过了Java的一次讲座,主题是类、方法、构造函数等。作业是一项任务: 创建一个类Person,其对象描述人员,并且只包含两个字段:name(String)和生年(int)。在此类中,定义 > 建造师姓名和出生年份; 构造函数只取名称并将出生年份设置为默认值1990; 方法是如果此人是女性,则女性返回true(我们不太明智地假设只有女性和所有女性的名字以字母“a”结尾);否则该方法返回false

  • 本文向大家介绍详解JAVA SPI机制和使用方法,包括了详解JAVA SPI机制和使用方法的使用技巧和注意事项,需要的朋友参考一下 JAVA SPI 简介 SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface。根据 Java 的 SPI 规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即服务提供者。然后在使用的时候再根据 SPI