重点是前三个:强引用,软引用,弱引用
要直到什么场景下会使用软引用和弱引用,面试官会问
引用就是指针,指向内存空间中某个对象
1.强引用 (就是直接引用)
我们平常A a=new A()所new出来的对象就是强引用
垃圾回收时,被强引用指向的对象不会被回收
2.软引用
当发生垃圾回收的时候,如果此时当内存不够的时候,会回收软引用指向的对象,如果内存时够的,不会回收这个被软引用指向的对象
SoftReference test=new SoftReference(new byte[1024*1024*10]);//new一个10MB的空间
或者下面的例子:
SoftReference test=new SoftReference(new String("aa"));
缓存中经常会用到软引用
强引用指向的对象不能被清除掉,很容易导致内存溢出有,当再有有用的数据进来的时候,没有空间存放了
用软引用的好处就是,空间不够的时候,软引用指向的对象就会被回收,这样有用的数据进来之后就有空间存放了
也就是说,软引用指向的一般是不重要的对象
软引用是实现缓存的理想选择,特别是当内存资源有限时。通过使用软引用来存储缓存的对象,当内存紧张时,垃圾收集器可以自动回收这些对象,从而避免了内存溢出(OutOfMemoryError)的风险。当内存资源充足时,缓存的对象可以保留在内存中,提高程序的运行效率。
3.弱引用
当发生垃圾回收的时候,不管内存够不够,软引用指向的对象都会被回收
WeakReference test=new WeakReference(new byte[1024*1024*10]);//new一个10MB的空间
或者:
WeakReference test=new WeakReference(new String("abc"));
System.out.println(test.get());//输出:abc
System.gc();//进行垃圾回收
System.out.println(test.get());//输出:null
在某些情况下,你可能希望缓存的对象在不被使用后就立即释放。这种情况下,弱引用可以作为缓存的理想选择。与软引用不同,弱引用不会在内存紧张时才被回收,而是在每次垃圾收集时都被回收。这可以帮助你在需要频繁释放缓存对象时提高内存使用效率。
软(弱)引用配合引用队列使用:软(弱)引用自身也是一个对象,当软(弱)引用的对象被回收掉以后,软(弱)引用自身这个对象会进入引用队列中
4.虚引用
引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收