Java中的“弱”引用有什么用?在Java中创建对象obj时,它被放置在堆上。当GC运行时,发现没有指向obj的引用,那么obj对象的堆内存空间就会被回收。也就是说,一个对象要被回收,必须满足两个条件:(1)没有引用指向它(2)运行了GC。在实际开发中,我们可以通过清空指向某个对象的所有referece来保证下次GC运行时该对象会被回收,类似如下:Objectc=newCar();c=null;但是,这样做是一种非常繁琐的做法,并且违背了GC自动回收的原则。对于简单的情况,手动清空是不需要程序员去做的,因为在java中,对于简单的对象,当调用它的方法执行的时候,它的引用就会从栈中弹出,所以可以在下一次回收GC执行。但是,也有特殊的例外。在使用缓存的时候,由于缓存的对象正是程序需要运行的对象,所以只要程序在运行,缓存中的引用就不会被GC(换句话说,缓存中的引用具有相同的与程序相同的生命周期)。然后随着缓存中的引用越来越多,GC回收不了的对象也越来越多,无法自动回收。当需要回收这些对象时,回收这些对象的任务就只能交给程序员了。但是,这违背了GC(自动收集可回收对象)的本质。因此java中引入了弱引用。Objectc=newCar();//只要c还指向carobject,carobject就不会被回收-->(strongreference)当一个对象只被一个弱引用指向,没有其他任何强引用时,如果GC运行,然后该对象将被回收。另外,关注公众号Java技术栈,后台回复:面试,可以拿到我整理的JVM系列面试题及答案,很全。下面是网上的一个例子。首先定义一个实体类:publicclassCar{privatedoubleprice;privateStringcolor;publicCar(doubleprice,Stringcolor){this.price=price;this.color=color;}publicdoublegetPrice(){returnprice;}publicStringgetColor(){returncolor;}publicStringtoString(){return"Thiscarisa"+this.color+"car,costs$"+price;}}一般在使用WeakReference的时候,会定义一个类来继承WeakReference,在这个类中定义一些其他的属性。这里没有定义其他属性:publicclassWeakReferenceCarextendsWeakReference{publicWeakReferenceCar(Carcar){super(car);}}主函数调用,当然为了更清楚的看到GC的效果,设置虚拟机参数"-XX:+PrintGCDetails":publicstaticvoidmain(String[]args){Carcar=newCar(2000.0,"red");WeakReferenceCarwrc=newWeakReferenceCar(car);wrc.setStr("111");inti=0;while(true){if(wrc.get()!=null){i++;System.out.println("WeakReferenceCar'sCarisalivefor"+i+",loop-"+wrc);}else{System.out.println("WeakReferenceCar'sCarhasbeancollected");break;}}}最后运行结果:WeakReferenceCar'sCarisalivefor68450,loop-interview.WeakReferenceCar@776ec8dfWeakReferenceCar'sCarisalivefor68451,loop-interview.WeakReferenceCar@776ec8dfWeakReferenceCar'sCarisalivefor68452,loop-interview.WeakReferenceCar@776ec8dfWeakReferenceCar'sCarisalivefor68453,loop-interview.WeakReferenceCar@776ec8df[GC(AllocationFailure)[PSYoungGen:34304K->1000K(38400K)]34320K->1016K(125952K),0.0015129secs][Times:user=0.02sys=0.02,real=0.00secs]WeakReferenceCar'sCarisalivefor68454,loop-interview.WeakReferenceCar@776ec8dfWeakReferenceCar'sCarhasbeancollectedHeapPSYoungGentotal38400K,used1986K[0x00000000d5e00000,0x00000000da900000,0x0000000100000000)edenspace33280K,2%used[0x00000000d5e00000,0x00000000d5ef6b70,0x00000000d7e80000)fromspace5120K,19%used[0x00000000d7e80000,0x00000000d7f7a020,0x00000000d8380000)tospace5120K,0%used[0x00000000da400000,0x00000000da400000,0x00000000da900000)ParOldGentotal87552K,used16K[0x0000000081a00000,0x0000000086f80000,0x00000000d5e00000)objectspace87552K,0%used[0x0000000081a00000,0x0000000081a04000,0x0000000086f80000)Metaspaceused3547K,capacity4564K,committed4864K,reserved1056768Kclassspaceused381K,capacity388K,committed512K,reserved1048576K可以看到在68454循环之后,WeakReferenceCar关联的对象Car被回收掉了,注意是弱引用关联的对象car被回收,而不是弱引用本身wrc被回收WeakReference的一个特点是它什么时候被回收是不确定的,因为它是由GC运行的不确定性决定的。所以,弱引用引用的对象一般都是有价值的缓存,很容易被重建,消耗大量内存。弱引用指向的对象被回收后,其实弱引用本身就没有用了。Java提供了一个ReferenceQueue来保存这些指向的对象。回收参考。用法是在定义WeakReference时,将一个ReferenceQueue对象作为参数传递给构造函数。