一看就懂的Java对象四种引用方式总结

本文深入解析Java中强引用、软引用、弱引用和虚引用的特点及应用场景,帮助理解垃圾回收机制。

这应该是一道很常见的面试题,但是有些小伙伴也不一定能很好的说清楚Java对象四种引用方式,本篇文章总结Java四种引用方式,希望可以帮到有缘人,哈哈。

强引用StrongReference

这种方式是平时工作中应用最多的一种引用方式。其特点是只要GC Root可达,就不会被回收,即使内存空间不足了,也只会抛出OOM的异常,并不会被回收。通常的用法就是Objec obj = new Object()

如果想中断或者回收强引用对象,可以显式地将引用赋值为null,这样的话JVM就会在合适的时间,进行垃圾回收。

软引用SoftReference

和强引用不同的是,软引用对象在内存中是可有可无的。软引用在GC Root可达且内存充足的时候不会被回收掉,当GC Root可达且内存不足的时候就会被回收掉。

只要软引用对象没有被回收掉,就可以使用。

SoftReference<byte[]> softReference = new SoftReference<>(new byte[1024 * 1024]);
弱引用WeakReference

相信看过ThreadLocal源码的小伙伴对着这种引用一定很熟悉吧。没错,ThreadLocal中的静态内部类ThreadLocalMap里面的entry是一个WeakReference的继承类。

static class Entry extends WeakReference<ThreadLocal<?>> {
	/** The value associated with this ThreadLocal. */
	Object value;

	Entry(ThreadLocal<?> k, Object v) {
		super(k);
		value = v;
	}
}

只要发生了GC,弱引用对象就会被回收掉。

虚引用PhantomReference

虚引用的设计和上面三种引用有些不同,它并不影响GC,而是为了在对象被GC时,能够收到一个系统通知。

那它是怎么被通知的呢?虚引用必须要配合ReferenceQueue,当GC准备回收一个对象,如果发现它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的ReferenceQueue中。

Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference<Object> phantomObj = new PhantomReference<Object>(obj , queue);
obj = null; //去除强引用
总结

一般来说强引用是平时开发中应用最多的,虚引用基本不怎么用。而软引用和弱引用的区别就是:软引用在内存不足的时候进行回收,弱引用只要进行GC就会被直接回收掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值