当前位置: 首页 > news >正文

持续总结中!2024年面试必问 100 道 Java基础面试题(四十二)

上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(四十一)-CSDN博客

八十三、如何判断一个对象是否应该被垃圾回收?

在Java中,判断一个对象是否应该被垃圾回收的关键在于对象的引用状态。垃圾回收器(Garbage Collector, GC)主要通过跟踪对象的引用来决定哪些对象不再需要,可以被回收。以下是如何判断一个对象是否可以被垃圾回收的详细解释:

对象的引用状态

  1. 强引用(Strongly Reachable)

    • 如果对象从根集合(如类实例、局部变量等)直接或间接被引用,那么这个对象是强引用的,它不会被垃圾回收。
  2. 软引用(Softly Reachable)

    • 如果对象只被软引用关联,那么在内存充足时,对象不会被回收,但在内存不足时,垃圾回收器会考虑回收这些对象。
  3. 弱引用(Weakly Reachable)

    • 对象被弱引用关联时,垃圾回收器会在下一次GC时回收这些对象,无论内存是否充足。
  4. 虚引用(Phantom Reachable)

    • 虚引用不会阻止对象的垃圾回收,它们的唯一目的是在对象被回收后收到一个系统通知。
  5. 无引用(Unreachable)

    • 如果对象到根集合之间没有任何引用链,那么这个对象被认为是无引用的,它将被垃圾回收。

垃圾回收器的判断过程

  1. 跟踪引用

    • 垃圾回收器会跟踪从根集合开始的所有引用链。
  2. 标记

    • 在标记阶段,GC遍历所有对象,标记所有可以通过GC Roots直接或间接访问到的对象。
  3. 清除

    • 在清除阶段,GC移除所有未被标记的对象,这些对象被认为是无引用的,可以被回收。
  4. 回收

    • 垃圾回收器释放被清除对象占用的内存,并将其归还给堆内存,以便将来分配新对象。

示例代码

public class GarbageCollectionExample {public static void main(String[] args) {Object obj1 = new Object(); // obj1是强引用的SoftReference<Object> softRef = new SoftReference<>(obj1); // obj1也是软引用的WeakReference<Object> weakRef = new WeakReference<>(obj1); // obj1也是弱引用的obj1 = null; // 清除obj1的强引用// 此时,obj1的软引用和弱引用仍然存在,但obj1的强引用已被清除// 垃圾回收器会在适当的时候回收obj1}
}

在这个示例中,obj1最初是强引用的,当它的强引用被设置为null时,它变成了无引用对象。尽管存在软引用和弱引用,但垃圾回收器仍然可以回收obj1

注意事项

  • 引用类型:了解不同引用类型的行为对于管理对象的生命周期和内存使用非常重要。

  • 垃圾回收触发:垃圾回收的触发条件和频率取决于JVM的具体实现和垃圾回收策略。

  • 性能影响:过度的垃圾回收会降低程序性能,因此合理分配和释放内存对于性能优化至关重要。

总结来说,判断一个对象是否可以被垃圾回收主要取决于它是否与根集合之间存在引用链。垃圾回收器通过跟踪这些引用链来识别无引用对象,并在适当的时候进行回收。

八十四、请解释Java中的强引用、软引用、弱引用和虚引用?

在Java中,引用(Reference)是一种用于跟踪对象是否还应该在内存中存活的机制。Java提供了四种类型的引用,它们定义了不同的GC行为:

强引用(Strongly Reachable)

  • 强引用是最普通的引用类型,当一个对象具有强引用时,它不会被垃圾回收器回收,直到这个引用被显式地设置为null,或者从它所属的上下文中被移除。
  • 示例:通过new关键字创建的对象默认具有强引用。
Object obj = new Object();

软引用(Softly Reachable)

  • 软引用通过java.lang.ref.SoftReference类实现,它们用来跟踪非必需对象。当内存充足时,软引用对象不会被回收,但是在内存不足时,垃圾回收器会优先回收这些对象。
  • 软引用常用于实现内存敏感的缓存,如图片缓存或其他大对象的缓存。
SoftReference<Object> softRef = new SoftReference<>(obj);

弱引用(Weakly Reachable)

  • 弱引用通过java.lang.ref.WeakReference类实现,它们比软引用的生存期更短。只要垃圾回收器执行,无论内存是否充足,弱引用对象都会被回收。
  • 弱引用常用于实现对象注册表或跟踪一些临时对象,而不用担心内存泄露。
WeakReference<Object> weakRef = new WeakReference<>(obj);

虚引用(Phantom Reachable)

  • 虚引用是生存期最短的引用,通过java.lang.ref.PhantomReference类实现。一个对象如果有虚引用,那么它几乎相当于没有引用,随时可能被垃圾回收器回收。
  • 虚引用主要用于跟踪对象被垃圾回收的行为,比如在对象被回收前执行一些清理工作。要获取虚引用,需要对象先被设置为null,然后通过java.lang.ref.ReferenceQueue来注册虚引用。
ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
Object obj = new Object();
obj = null; // 清除强引用
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), refQueue);

注意事项

  • 内存感知:软引用和弱引用可以帮助开发者创建对内存感知的程序,它们在内存不足时可以被回收,从而避免内存溢出。
  • 生命周期:虚引用的生命周期最短,它们几乎不会阻止对象的垃圾回收。
  • 使用场景:根据对象的重要性和内存使用策略,选择合适的引用类型。
  • 回收时机:垃圾回收器的回收时机是不确定的,即使内存不足,软引用和弱引用的对象也可能不被立即回收。

总结来说,Java中的四种引用类型提供了不同的GC行为,允许开发者根据程序的内存使用需求和对象的重要性来管理对象的生命周期。

http://www.lryc.cn/news/347258.html

相关文章:

  • Linux 之 tail 命令
  • 【Android学习】简单的登录页面和业务逻辑实现
  • Mysql数据库的基础学习
  • CentOS7 安装 Kamailio
  • Tomcat启动闪退问题解决办法
  • 单元测试之JUnit5知识点总结及代码示例
  • 什么是数据平台——企业构建Data+AI的基础数据底座需要的决策参考
  • Oracle 流stream数据的复制
  • 「 安全设计 」68家国内外科技巨头和安全巨头参与了CISA发起的安全设计承诺,包含MFA、默认密码、CVE、VDP等七大承诺目标
  • 【K8S】pod无限重启,报错Back-off restarting failed container
  • 摸鱼文章1
  • 【设计模式】之适配器模式
  • Python轻量级Web框架Flask(13)—— Flask个人博客项目
  • 电商技术揭秘营销相关系列文章合集(4)
  • LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】
  • 再有人说数字孪生大屏没有用,用这8条怼回去。
  • 蓝桥杯练习系统(算法训练)ALGO-946 Q神的足球赛
  • 【Android】Kotlin学习之Kotlin方法的声明和传参
  • 微信小程序 17:小程序使用 npm 包和组件应用
  • 【mysql篇】执行delete删除大量数据后,磁盘未清空,为什么?
  • 【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍
  • 在Mars3d实现cesium的ImageryLayer自定义瓦片的层级与原点
  • logback日志持久化
  • 函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)
  • Go有无缓冲channel的区别
  • 【全开源】Fastflow工作流系统(源码搭建/上线/运营/售后/维护更新)
  • 超越传统游戏:生成式人工智能对游戏的变革性影响
  • SpringCloud微服务之Eureka、Ribbon、Nacos详解
  • 五角钱的程序员 | Kafka 是什么?
  • C++中合成的默认构造函数的访问权限