首页
学习
活动
专区
圈层
工具
发布

Java Review (十八、面向对象----对象与垃圾回收)

在垃圾回收机制回收任何对象之前,总会先调用它的 finalize()方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象) ,从而导致垃圾回收机制取消回收。...finalize 方法 在垃圾回收机制回收某个对象所占用的内存之前,通常要求程序调用适当的方法来清理资源 , 在没有明确指定清理资源的情况下, Java 提供了默认机制来清理该对象的资源,这个机制就是...因此,完全有可能出现这样一种情形:某个失去引用的对象只占用了少量内存,而且系统没有产生严重的内存需求,因此垃圾回收机制并没有试图回收该对象所占用的资源,所以该对象的自finalize()方法也不会得到调用...(); //③ ft.info(); } public void finalize() { // 让 ft 引用到试图回收的可恢复对象,即可恢复对象重新变成可达 ft = this...图四:调用info()方法时引发空指针异常 ?

62110

Java并发-ThreadLocal

共有四种引用类型:强引用、软引用、弱引用、虚引用。 1.2.1 强引用(StrongReference) 被强引用的对象不会被垃圾回收器主动回收,即使抛出OOM异常,使程序终止。...1.2.2 软引用(SoftReference) 软引用的生命周期比强引用的短一些,只有当JVM认为内存不足时,才会去试图回收软引用指向的对象。JVM会确保在抛出OOM异常前,清理软引用对象。...应用场景:可用于内存敏感的缓存。 1.2.4 虚引用(PhantomReference) 无法通过虚引用来访问对象的任何属性或函数。虚引用仅仅提供了一直确保对象被finalize后,做某些事情的机制。...虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾收集器准备回收某个对象时,若发现它还有虚引用,则会在回收对象的内存之前,将这个虚引用加入到与之关联的引用队列中。...1.2.5 引用队列(ReferenceQueue) 引用队列可以和软引用、弱引用、虚引用一起配合使用,当垃圾回收器回收一个对象时,若发现它还有引用,就会在回收对象之前将这个引用加入到与之关联的引用队列中去

60910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android-强,软,弱,虚引用

    那么如何回收引用对象为空的SoftReference对象呢?...当我们调用当我们调用它的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象。...所以我们把MyHandller定义为静态内部类避免引用Activity,但这样的问题是:之前可以直接使用Activity中的方法,现在不持有外部Activity的引用,也就没办法直接通过方法名调用了。...4.Android引用之虚引用(PhantonReference). ?       虚引用是所有引用类型中最弱的一个。一个持有虚引用的对象,和没有引用几乎是一样的,随时都可能被垃圾回收器回收。...当试图通过虚引用的get()方法取得强引用时,总是会失败。并且,虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。

    60210

    【Android 内存优化】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 )

    , 直接回收 , 即使内存足够 , 也要回收该对象所占用的内存 ; ④ 虚引用 : 虚引用无法获得被引用的对象 , 其唯一的作用是对象被回收时 , 可以得到相应的通知 ; 虚引用不会对对象的生存周期造成影响任何...(new Object()); ② 传入创建好的对象引用创建软引用 : 软引用是通过在 软引用构造函数 传入引用对象创建的 , 首先要创建引用对象 ; 下面的强引用可以在创建软引用完毕后置空解除引用..., 可以通过调用 referenceQueue.poll() 方法, 获取到被回收的引用 // 如果获取到 null, 说明该软引用没有被回收 // 如果该软件用被回收,..., 可以通过调用 referenceQueue.poll() 方法, 获取到被回收的引用 // 如果获取到 null, 说明该软引用没有被回收 // 如果该软件用被回收,...(new Object()); ② 传入创建好的对象引用创建弱引用 : 弱引用是通过在 弱引用构造函数 传入引用对象创建的 , 首先要创建引用对象 ; 下面的强引用可以在创建软引用完毕后置空解除引用

    5.7K10

    小题大做 | Handler内存泄露全面分析

    其实也挺好理解的吧,因为在内部类中可以调用外部类的方法,变量等等,所以肯定会持有外部类的引用的。...中的内部类与Java有什么不一样吗 其实可以看到,在上述的代码中,我都加了一句 btn2.setText("2222") 这是因为在kotlin中的匿名内部类分为两种情况: 在Kotlin中,匿名内部类如果没有使用到外部类的对象引用时候...如果需要调用外部的对象方法,就需要用inner修饰,改成和Java一样的内部类,并且会持有外部类的引用,需要考虑内存泄漏问题。 解决内存泄漏 说了这么多,那么该怎么解决内存泄漏问题呢?...将对象的强引用改成弱引用 强引用就是对象被强引用后,无论如何都不会被回收。 弱引用就是在垃圾回收时,如果这个对象只被弱引用关联(没有任何强引用关联他),那么这个对象就会被回收。...软引用就是在系统将发生内存溢出的时候,回进行回收。 虚引用是对象完全不会对其生存时间构成影响,也无法通过虚引用来获取对象实例,用的比较少。

    1.1K30

    Java中的强引用、软引用、弱引用、幻象引用有什么区别和使用场景

    只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象:即JVM 会确保在抛出 OutOfMemoryError之前,清理软引用指向的对象。...后续,我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。...在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。由于垃圾回收器是一个优先级很低的线程,因此不一定会很快回收弱引用的对象。...当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。...应用场景:可用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。

    1K20

    JVM 系列(5)吊打面试官:说一下 Java 的四种引用类型

    只有强可达的对象才会认为是存活的对象,才能保证在垃圾收集的过程中不会被回收; 维度 2 - 垃圾回收策略的区别: 除了影响对象的可达性状态,不同的引用类型还会影响垃圾收集器回收对象的激进程度: 强引用:...在虚拟机即将回收对象之前,如果发现对象还存在虚引用,则会在回收对象后会将引用加入到关联的引用队列中。程序可以通过观察引用队列的方式,来感知到对象即将被垃圾回收的时机,再采取必要的措施。...引用队列可以为空,但虚引用必须关联引用队列,否则没有意义; 2、获取实际对象: 在实际对象被垃圾收集器回收之前,通过 Reference#get() 可以获取实际对象,在实际对象被回收之后 get()...,用于实现在对象被垃圾回收时额外执行一段清理逻辑,本质上只是将虚引用和引用队列等代码做了简单封装而已。...: 在实际对象被回收后,调用最终会将临时队列 cleared_references 传递到 Java 层的静态方法 ReferenceQueue#add(),从而存储到 Java 层的 unenqueued

    76710

    Java 引用类型简述

    但是f类是会被JVM注册到java.lang.ref.Finalizer类中的。 ① 当前类或父类中含有一个参数为空,返回值为void的名为finalize的方法。...② 并且该finalize方法必须非空 GC 回收问题 对象因为Finalizer的引用而变成了一个临时的强引用,即使没有其他的强引用,还是无法立即被回收; 对象至少经历两次GC才能被回收,因为只有在.../** * 软引用:对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收( 因为是在第一次回收后才会发现内存依旧不充足,才有了这第二次回收 )。...其实虚引用主要被用来 跟踪对象被垃圾回收的状态,通过查看引用队列中是否包含对象所对应的虚引用来判断它是否 即将被垃圾回收,从而采取行动。...一个持有虚引用的对象,和没有引用几乎是一样的,随时都有可能被垃圾回收器回收。 * 虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。

    89070

    强引用、软引用、弱引用、幻象引用有什么区别?

    只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象:即JVM 会确保在抛出 OutOfMemoryError 之前,清理软引用指向的对象。...后续,我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。...在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。 由于垃圾回收器是一个优先级很低的线程,因此不一定会很快回收弱引用的对象。...虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。...应用场景:可用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。

    69100

    深入浅出JVM(十四)之内存溢出、泄漏与引用

    Java中的内存溢出与内存泄漏并说明强引用、软引用、弱引用、虚引用的特点与使用场景引用在栈上的reference类型存储的数据代表某块内存地址,称reference为某内存、某对象的引用实际上引用分为很多种...,从强到弱分为:强引用 > 软引用 > 弱引用 > 虚引用平常我们使用的引用实际上是强引用,各种引用有自己的特点,下文将一一介绍强引用就是Java中普通的对象,而软引用、弱引用、虚引用在JDK中定义的类分别是...调用finalize方法 object is alive 第二次gc 对象死了 实例被回收 object is dead */第一次GC时,守护线程执行finalize方法让虚引用重新可达,所以没死第二次...GC时,不再执行finalize方法,虚引用已死虚引用回收后,引用队列有数据,来通知告诉我们reference这个对象被回收了使用场景GC只能回收堆内内存,而直接内存GC是无法回收的,直接内存代表的对象创建一个虚引用...,加入引用队列,当这个直接内存不使用,这个代表直接内存的对象为空时,这个虚内存就死了,然后引用队列会产生通知,就可以通知JVM去回收堆外内存(直接内存)总结本篇文章围绕引用深入浅出的解析内存溢出与泄漏、

    36321

    你不可不知的Java引用类型之——虚引用

    当试图通过虚引用的get()方法取得强引用时,总是会返回null,并且,虚引用必须和引用队列一起使用。既然这么虚,那么它出现的意义何在?? 别慌别慌,自然有它的用处。...当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,将这个虚引用加入引用队列,在其关联的虚引用出队前,不会彻底销毁该对象。...如果一个对象没有强引用和软引用,对于垃圾回收器而言便是可以被清除的,在清除之前,会调用其finalize方法,如果一个对象已经被调用过finalize方法但是还没有被释放,它就变成了一个虚可达对象。...与软引用和弱引用不同,显式使用虚引用可以阻止对象被清除,只有在程序中显式或者隐式移除这个虚引用时,这个已经执行过finalize方法的对象才会被清除。...事实上,虚引用有一个很重要的用途就是用来做堆外内存的释放,DirectByteBuffer就是通过虚引用来实现堆外内存的释放的。

    51730

    JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】

    每一个栈帧中分配多少内存基本上在类结构确定下来的时候就已知的,因此线程独享区的内存分配和回收都具备确定性,这几个区域就不需要过多考虑回收的问题,因为方法结束或者线程结束的时候,内存就跟着回收了。...---- 弱引用 只需要给强引用对象counter赋空值null,该对象就可以被垃圾回收器回收。...拥有虚引用的对象可以在任何时候被垃圾回收器回收。...在使用可达性分析算法的虚机中,比如我们常用的hotspot, 当对象不可达时,需要至少经历两次标记过程,才能确定是否要回收。...第一次逃脱成功,原因在于对象重写了finalize()方法,在手动调用System.gc()时触发垃圾回收,在执行finalize()方时, 在其中将 SAVE_HOOK重新用this关键字挂上和当前对象关系

    61730

    Java中的Reference类使用

    Reference引用类的几种类型 在jvm中,一个对象如果不再被使用就会被当做垃圾给回收掉,判断一个对象是否是垃圾,通常有两种方法:引用计数法和可达性分析法。...我简单总结了下,软引用对象具体的回收策略如下: 如果已经没有引用指向软引用对象,那么这个对象会被JVM回收; 如果还有软引用指向这个软引用对象,就判断在某段之间之内(_max_interval),有没有调用过...SoftReference的get方法,如果在_max_interval时间内没调用过get方法,那么即使还有软引用指向这个对象,JVM也会回收这个对象,如果在_max_interval时间内调用过get...// 没有这段暂停的话,JVM不会回收软引用对象,因为一直有线程在快速地调用软引用的get方法 TimeUnit.MILLISECONDS.sleep(10);...另外从ReferenceQueue这个名字也可以看出,它是一个队列,当我们调用它的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象。

    1.1K10

    你知道Java的四种引用类型吗?

    也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。...一旦垃圾线程回收该Java对象之后,get()方法将返回null。 下面举一个例子说明软引用的使用方法。 在你的IDE设置参数 -Xmx2m -Xms2m规定堆内存大小为2m。...并显式的再调用一次GC,结果如下: 是否被回收null 说明在系统内存紧张的情况下,软引用被回收。 ? 04 弱引用 弱引用是一种比软引用较弱的引用类型。...一个持有虚引用的对象,和没有引用几乎是一样的,随时可能被垃圾回收器回收。当试图通过虚引用的get()方法取得强引用时,总是会失败。并且,虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。...当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,销毁这个对象,将这个虚引用加入引用队列。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。

    1.1K30

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

    Java与C/C++的相似性和不同之处在于:在C++中,对象的内存在哪个时刻被回收,是可以明确确定的(假设程序没有缺陷),一旦C++的对象要被回收了,在回收该对象之前对象的析构函数将被调用,在该函数中释放对象占用的内存...;在java中,对象的内存在哪个时刻回收,取决于垃圾回收器何时运行,一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存...我们知道,finalize()方法是Object类中的一个方法体为空的方法,而我们创建的所有类默认都继承Object类,因而只有当我们在自定义类中覆写了该方法时,JVM在回收我们定义的类的时候,才会调用...finalize方法,则是在第一垃圾回收将该类销毁之后,才会将虚拟引用对象添加到引用队列,如果被引用对象覆写了finalize方法,则是当执行完第二次垃圾回收之后,才会将虚引用对象添加到其关联的引用队列...,在执行第一次gc之后,从队列中poll到的引用对象不为空,说明确实在第一次gc之后,弱引用对象被添加进了弱引用队列;相反,对于虚引用,第一次gc之后,从虚引用队列中获取的对象为null,直到第二次gc

    1K20

    Java的强引用、软引用、弱引用、虚引用

    finalize()方法会在对象被回收前调用,一个对象只有一次被调用的机会。对象可以在这个方法里进行自救,逃过被垃圾回收。...强引用是直接new出来调用的对象,大家都知道。由上面实验可知,在系统内存很富裕的情况下,因为强引用内存不能被释放,所以会多申请了很多内存。...下一次GC,这中间产生的软引用对象也都被回收了。 ? 最终,由于GC及时,整个过程没有爆发OOM,平安的结束了。 ? 虚引用 虚引用也叫幻影引用。任何时候可能被GC回收,就像没有引用一样。...并且他必须和引用队列一起使用,用于跟踪垃圾回收过程,当垃圾回收器回收一个持有虚引用的对象时,在回收对象后,将这个虚引用对象加入到引用队列中,用来通知应用程序垃圾的回收情况。...先来实验一下,从下面结果可看到从一开始取出来就是空对象,基本上刚创建出来就被回收了。 ? 一个像是从来没有存在过的幻影有什么用呢?Java的Unsafe类和NIO都可以直接访问堆外内存。

    2.6K31

    JVM&GC之java引用

    也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。...当调用它的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象。...在任何时候,都可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强可及对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。...图片.png 虚引用 又称为幽灵引用,主要目的是在一个对象所占的内存被实际回收之前的到通知,从而可以进行一些相关的清理工作。...程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

    93620

    JVM之垃圾回收相关概念

    2)在java.nio.Bits.reserveMemory()方法中,我们能清楚的看到,System.gc()会被调用,以清理空间。...相对的,软引用、弱引用和虚引用的对象是软可触及、弱可触及和虚可触及的,在一定条件下,都是可以被回收的。所以,强引用是造成Java内存泄漏的主要原因之一。 总结 强引用可以直接访问目标对象。...当试图通过虚引用的get()方法取得对象时,总是null ,即通过虚引用无法获取到我们的数据 为一个对象设置虚引用关联的唯一目的在于跟踪垃圾回收过程。...由于虚引用可以跟踪对象的回收时间,因此,也可以将一些资源释放操作放置在虚引用中执行和记录。 在JDK1.2版之后提供了PhantomReference类来实现虚引用。...由Finalizer线程通过终结器引用找到被引用对象调用它的finalize()方法,第二次GC时才回收被引用的对象

    30510

    JVM面试题解析

    哪些对象可以作为 GC Roots 的对象: 虚拟机栈(栈帧中的局部变量区,也叫局部变量表)中引用的对象 方法区中的类静态属性引用的对象 方法去常量引用的对象 本地方法栈中 JNI (Native方法)...只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象:即 JVM 会确保在抛出 OutOfMemoryError 之前,清理软引用指向的对象。...后续,我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。...虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。...如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取一些程序行动。

    18700

    ThreadLocal之美!

    起点是get方法,map为空,调用initial方法的罢了 内存泄漏 很多人都不容为什么拦截器的最后,要remove一下,Jvm垃圾回收器不是可以回收吗?...这里先理清一下内存泄漏和内存溢出的区别 内存泄漏指的是:对象不使用了,应该被回收,但是没被回收 内存溢出指的是:就是申请的内存不够用,造成outofMemory 再讲一下:四大引用 强软弱虚 强引用,Reference...,内存资源够的时候,触发GC也不会回收,但是内存不够了,就会回收,指的就是有用,但不是非要不可的地步 弱引用:WeakReference 用完就没用了的东西,用过了,gc的时候一定会被回收 虚引用就用的很少了...,目的是让系统知道这个对象被回收 总结 引用类型 被垃圾回收时刻 用途 生存时间 强引用 从来不会 对象的一般状态 JVM停止运行时终止 软引用 在内存不足时 对象简单,缓存,文件缓存,图片缓存 内存不足时终止...弱引用 在gc垃圾回收时 对象简单,缓存,文件缓存,图片缓存 gc运行后终止 虚引用 任何时候都可能被垃圾回收器回收 基本不写,虚拟机使用, 用来跟踪对象被垃圾回收器回收的活动 未知 我们看一下threadLocalMap

    37520
    领券