首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java finalize函数与软引用、弱引用、虚引用

    它不是C/C++中的析构函数,而是Java刚诞生时为了使C/C++程序员更容易接受它所做出的一个妥协”。也就是说,finalize函数最初被设计的用途是类似于C/C++的析构函数,用于在对象被销毁前最后的内存回收。Java与C/C++的相似性和不同之处在于:在C++中,对象的内存在哪个时刻被回收,是可以明确确定的(假设程序没有缺陷),一旦C++的对象要被回收了,在回收该对象之前对象的析构函数将被调用,在该函数中释放对象占用的内存;在java中,对象的内存在哪个时刻回收,取决于垃圾回收器何时运行,一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存,由于JVM垃圾回收运行时机是不确定的,因而finalize()的调用具有不确定性。JVM只保证方法会调用,但不保证方法里的任务会被执行完(这块儿可以从Java源码Finalizer.class中得知:在源码中,执行finalize()方法是通过开启一个低优先级的线程来执行的,而finalize()方法在执行过程中的任何异常都会被catch,然后被忽略,因而无法保证finalize方法里的任务会被执行完)。由于执行finalize()的是一个低优先级的线程,既然是一个新的线程,虽然优先级低了点,但也是和垃圾收集器并发执行的,所以垃圾收集器没必要等这个低优先级的线程执行完才继续执行。也就是说,有可能会出现对象被回收之后,那个低优先级的线程才执行finalize()方法。

    02

    详解 Java 中的四种引用

    在 Java 中,引用随处可见,我们通过类似 Object obj = new Object(); 的代码就可以创建一个引用,而我们直接通过这个代码段创建的引用被称为强引用(StrongReference),这种引用的特点是其指向的对象无论如何都不会被 JVM 的垃圾回收器(Garbage Collector)回收(即使是面临着发生 OutOfMemoryError 异常的风险)。 但是可能在开发中,我们可能会需要一些具有其他特性的引用对象,比如说:我们需要某种引用可以提供这种功能:在新建其他对象时,如果当前堆内存足够用来分配给要新建的对象时,那么垃圾回收器不会回收这种引用指向的对象,但是如果当前可分配的堆内存不足时,我们希望垃圾回收器可以回收这种引用指向的对象,以提供足够的内存来创建新的对象。

    03
    领券