JVM-如何判断对象可以回收

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001


在Java中,判断对象是否可以被回收是通过垃圾回收器(Garbage Collector)来完成的。Java的垃圾回收器使用了一种称为"可达性分析"(Reachability Analysis)的算法来确定对象是否可达。

可达性分析算法基于以下原理:当一个对象不再被任何活动的引用所引用时,即没有任何方式可以访问到该对象时,该对象就被认为是不可达的,可以被回收。

Java中的引用分为四种类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。

  1. 强引用:使用最常见的引用类型,如果一个对象具有强引用,即使系统内存不足时,垃圾回收器也不会回收该对象。只有当强引用被显式地置为null时,才可能被回收。

  2. 软引用:软引用用于描述还有用但非必需的对象。当系统内存不足时,垃圾回收器可能会回收软引用对象。可以通过SoftReference类来创建软引用。

  3. 弱引用:弱引用用于描述非必需的对象,当垃圾回收器运行时,只要发现弱引用对象,不管内存是否充足,都会将其回收。可以通过WeakReference类来创建弱引用。

  4. 虚引用:虚引用主要用于跟踪对象被垃圾回收的状态,无法通过虚引用访问对象,也无法通过虚引用取得对象的引用。可以通过PhantomReference类来创建虚引用。

Java垃圾回收器通过遍历对象的引用关系图,从GC Roots(一组根对象,如虚拟机栈、本地方法栈、静态变量等)出发,标记所有可达的对象,未被标记的对象就被认为是不可达的,可以被回收。

需要注意的是,垃圾回收器的工作是自动进行的,程序员无法直接控制对象的回收时机。但可以通过System.gc()方法来建议垃圾回收器进行垃圾回收操作。

最后更新于