前言
在Java编程中,对象是通过引用来访问的,这些引用类型决定了对象的生命周期和内存管理方式。Java中有四种引用类型,分别是强引用、软引用、弱引用和虚引用,Java面试中,有关如果问到垃圾回收相关点,大概率也会问题Java对象引用类型有哪几种?下面我们来详细了解一下这四种引用类型。
强引用(正常引用)
当我们使用 new 这个关键字创建对象时创建出来的对象就是强引用(new出来对象为强引用) 如
代码语言:actionscript复制Object obj = new Object()
这个obj就是一个强引用了。
如果一个对象具有强引用。垃圾回收器就不会回收有强引用的对象。
如当jvm内存不足时,具备强引用的对象,虚拟机宁可会抛出OutOfMemoryError(内存空间不足),使程序终止,也不会靠垃圾回收器去回收该对象来解决内存。引用消失就会被垃圾回收
软引用:SoftReference
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。
只要垃圾回收器没有回收它,该对象就可以被程序使用。定义一个软引用:
代码语言:java复制SoftReference<Object> obj = new SoftReference<>(new Object());
弱引用: WeakReference
弱引用是一种比软引用更弱的引用类型。当一个对象只被弱引用指向时,它可以被垃圾回收器回收,并且不会被放入任何队列中。当内存不足时,垃圾回收器会尝试回收弱引用指向的对象。定义一个弱引用:
代码语言:java复制WeakReference<Object> obj = new WeakReference<>(new Object());
虚引用:PhantomReference
虚引用是一种最弱的引用类型。当一个对象只被虚引用指向时,它可以被垃圾回收器回收,并且不会被放入任何队列中。与软引用和弱引用不同的是,虚引用的主要作用是在对象被回收之前执行一些清理操作。定义一个虚引用:
代码语言:java复制PhantomReference<Object> obj = new PhantomReference<>(new Object(), new PhantomReferenceQueue());
GC回收情况
强软弱虚引用,这四种类型的引用使用强度依次递减的。
强:最强的引用类型,当前仅当该类型主动释放对象空间,即赋值为null的时候,才会进行垃圾回收。只要该引用保留对象,则如果GC怎么申请都是不会回收的。
软:次于强,当GC回收时,如果内存空间已满,不够用了,则会对该类型进行回收。 适合做缓存
弱:只要GC回收,则立马被回收。 解决map存在内存泄漏的问题
虚:相当于没有引用
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!