这篇文章给大家介绍参考方法如何在Java项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
<强> Java 参考详解强>
在jdk 1.2及其以后,引入了强引,用软引,用弱引,用虚引用这四个概念。网上很多关于这四个概念的解释,但大多是概念性的泛泛而谈,今天我结合着代码分析了一下,首先我们先来看定义与大概解释(引用类型在包. lang。ref里)。
<强> 1,强引用(StrongReference) 强>
强引用不会被GC回收,并且在. lang。ref里也没有实际的对应类型。举个例子来说:
refQueue=new ReferenceQueue
看了简单的定义之后,我们结合着代码来测试一下,强引用就不用说了,软引用的描述也很清楚,关键是“弱引用”与“虚引用”。
<强>弱引用:强>
公共静态void main (String [] args)抛出InterruptedException { 对象obj=新对象(); ReferenceQueuerefQueue=new ReferenceQueue (); WeakReference weakRef=new WeakReference (obj, refQueue); System.out.println (weakRef.get ()); System.out.println (refQueue.poll ()); obj=零; system . gc (); System.out.println (weakRef.get ()); System.out.println (refQueue.poll ()); }
由于system . GC()是告诉JVM中这是一个执行GC的好时机,但具体执不执行由JVM决定,因此当JVM决定执行GC,得到的结果便是(事实上这段代码一般都会执行GC):
java.lang.Object@de6ced 零 零 java.lang.ref.WeakReference@1fb8ee3
从执行结果得知,通过调用weakRef.get()我们得到了obj对象,由于没有执行GC,因此refQueue.poll()返回的空,当我们把obj=零;此时没有引用指向堆中的obj对象了,这里JVM执行了一次GC,我们通过weakRef.get()发现返回了空,而refQueue.poll()返回了WeakReference对象,因此JVM在对obj进行了回收之后,才将weakRef插入到refQueue队列中。
<强>虚引用:强>
公共静态void main (String [] args)抛出InterruptedException { 对象obj=新对象(); ReferenceQueuerefQueue=new ReferenceQueue (); PhantomReference phanRef=new PhantomReference (obj, refQueue); System.out.println (phanRef.get ()); System.out.println (refQueue.poll ()); obj=零; system . gc (); System.out.println (phanRef.get ()); System.out.println (refQueue.poll ()); }
同样,当JVM执行了GC,得到的结果便是:
零 零 零 java.lang.ref.PhantomReference@1fb8ee3
从执行结果得知,我们先前说的没有错,phanRef.get()不管在什么情况下,都会返回零,而当JVM执行GC发现虚引用之后,JVM并没有回收obj,而是将PhantomReference对象插入到对应的虚引用队列refQueue中,当调用refQueue.poll()返回PhantomReference对象时,调查方法会先把PhantomReference的持有队列队列(ReferenceQueue<及# 63;超级T>)置为空,空对象继承自ReferenceQueue,将排队(参考paramReference)方法覆盖为返回false,而此时obj再次被GC发现时,JVM再将PhantomReference插入到零队列中便会插入失败返回假,此GC时便会回收obj。事实上通过这段代码我们也的却看不出来obj是否被回收,但通过PhantomReference的javadoc注释中有一句是这样写的: