MST

星途 面试题库

面试题:Java中对象生命周期及弱引用基础

请简要描述Java对象从创建到被垃圾回收的整个生命周期过程,并说明弱引用在其中起到什么作用。如果有一个对象仅被弱引用指向,在垃圾回收机制下会发生什么?
26.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

Java对象生命周期过程

  1. 创建阶段
    • 声明:声明一个对象变量,例如 Object obj; ,此时只是在栈中创建了一个引用变量,并未实际创建对象。
    • 实例化:使用 new 关键字创建对象,如 obj = new Object(); 。JVM会在堆内存中为对象分配空间,初始化对象的成员变量为默认值,然后执行构造函数对对象进行进一步初始化。
  2. 使用阶段:对象创建完成后,可以通过对象引用访问对象的属性和方法,对对象进行各种操作,如 obj.hashCode();
  3. 不可达阶段:当一个对象不再被任何强引用所指向时,它就进入了不可达阶段。例如将引用变量赋值为 nullobj = null; ,此时该对象就无法再通过引用访问到,成为垃圾回收的潜在对象。
  4. 垃圾回收阶段:垃圾回收器会在合适的时机扫描堆内存,回收那些不可达对象所占用的内存空间,使得这些内存可以被重新使用。

弱引用的作用

弱引用(WeakReference)的作用是在保持对对象的一种较弱的引用关系。即使对象还有弱引用指向它,但只要没有强引用指向它,在垃圾回收器进行垃圾回收时,一旦发现该对象只有弱引用指向,就会回收该对象所占用的内存。弱引用常用于实现对内存敏感的缓存等场景,在内存不足时,缓存中的对象可以被及时回收,以释放内存。

仅被弱引用指向的对象在垃圾回收机制下的情况

如果一个对象仅被弱引用指向,当垃圾回收器运行时,无论当前内存是否紧张,都会回收该对象所占用的内存空间。例如:

Object strongRef = new Object();
WeakReference<Object> weakRef = new WeakReference<>(strongRef);
strongRef = null; // 切断强引用
// 当垃圾回收器运行时,对象会被回收

垃圾回收器扫描到对象只有弱引用指向时,就会回收该对象,之后再通过 weakRef.get() 获取对象时会返回 null