面试题答案
一键面试Java对象生命周期过程
- 创建阶段:
- 声明:声明一个对象变量,例如
Object obj;
,此时只是在栈中创建了一个引用变量,并未实际创建对象。 - 实例化:使用
new
关键字创建对象,如obj = new Object();
。JVM会在堆内存中为对象分配空间,初始化对象的成员变量为默认值,然后执行构造函数对对象进行进一步初始化。
- 声明:声明一个对象变量,例如
- 使用阶段:对象创建完成后,可以通过对象引用访问对象的属性和方法,对对象进行各种操作,如
obj.hashCode();
。 - 不可达阶段:当一个对象不再被任何强引用所指向时,它就进入了不可达阶段。例如将引用变量赋值为
null
,obj = null;
,此时该对象就无法再通过引用访问到,成为垃圾回收的潜在对象。 - 垃圾回收阶段:垃圾回收器会在合适的时机扫描堆内存,回收那些不可达对象所占用的内存空间,使得这些内存可以被重新使用。
弱引用的作用
弱引用(WeakReference
)的作用是在保持对对象的一种较弱的引用关系。即使对象还有弱引用指向它,但只要没有强引用指向它,在垃圾回收器进行垃圾回收时,一旦发现该对象只有弱引用指向,就会回收该对象所占用的内存。弱引用常用于实现对内存敏感的缓存等场景,在内存不足时,缓存中的对象可以被及时回收,以释放内存。
仅被弱引用指向的对象在垃圾回收机制下的情况
如果一个对象仅被弱引用指向,当垃圾回收器运行时,无论当前内存是否紧张,都会回收该对象所占用的内存空间。例如:
Object strongRef = new Object();
WeakReference<Object> weakRef = new WeakReference<>(strongRef);
strongRef = null; // 切断强引用
// 当垃圾回收器运行时,对象会被回收
垃圾回收器扫描到对象只有弱引用指向时,就会回收该对象,之后再通过 weakRef.get()
获取对象时会返回 null
。