本篇文章给大家分享的是有关怎么在Java中实现引用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
一、引用的定义
在JDK 1.2以前,Java中的引用定义很传统:如果reference类型的数据存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。
二、问题
当描述这样的一类对象:当内存空间还足够时,则能保留在内存之中,如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。此时的引用就显得过于狭隘。因此在JDK 1.2之后,Java堆引用的概念进行了扩充。
三、引用的分类
回收时机 | |||
强引用 | Strong Reference | 类似Object obj = new Object() | 只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象 |
软引用 | Soft Reference | 描述一些还有用但并非必须的对象 | 在系统将要发生内存溢出的异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常 |
弱引用 | Weak Reference | 用来描述非必须对象,强度比软引用更弱。被弱引用关联的对象只能生存到下一次垃圾收集发生之前 | 当垃圾收集器工作时,无论当前内存是否足够,都会回收掉纸杯弱引用关联的对象 |
虚引用 | Phantom Reference | 又称为幽灵引用或幻影引用,最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。 | 为一个对象设置虚引用关联的卫衣目的就是能在这个对象被收集器回收时收到一个系统通知 |
四、应用场景
1.强引用
最常用的,应用场景最多,everywhere
2.软引用
只有将要发生OOM的时候,才会主动回收,应用在一些内存限制比较大的应用内,避免发生OOM。
3.弱引用
不管是young gc 还是 full gc 都会回收弱引用的对象。当你想引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候你就是用弱引用。
4.虚引用
在回收时可以检测到,虚引用主要用来跟踪对象被垃圾回收器回收的活动。
五、源码
package org.pdool.ref;import java.lang.ref.Reference;import java.lang.ref.ReferenceQueue;import java.lang.ref.WeakReference;import java.util.LinkedList;public class ReferenceTest { private static ReferenceQueue<VeryBig> rq = new ReferenceQueue<VeryBig>(); public static void checkQueue() { Reference<? extends VeryBig> ref = null; while ((ref = rq.poll()) != null) { // 只留有引用,没有对象 System.out.println("In queue: " + ((VeryBigWeakReference) (ref)).id); } } public static void main(String args[]) { int size = 3; LinkedList<WeakReference<VeryBig>> weakList = new LinkedList<WeakReference<VeryBig>>(); for (int i = 0; i < size; i++) { weakList.add(new VeryBigWeakReference(new VeryBig("Weak " + i), rq)); System.out.println("Just created weak: " + weakList.getLast()); } System.gc(); try { // 暂停6s,让上面的垃圾回收线程运行完成 Thread.currentThread().sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } checkQueue(); }}class VeryBig { public String id; // 占用空间,让线程进行回收 byte[] b = new byte[2 * 1024]; public VeryBig(String id) { this.id = id; } protected void finalize() { System.out.println("Finalizing VeryBig " + id); }}class VeryBigWeakReference extends WeakReference<VeryBig> { public String id; public VeryBigWeakReference(VeryBig big, ReferenceQueue<VeryBig> rq) { super(big, rq); this.id = big.id; } protected void finalize() { System.out.println("Finalizing VeryBigWeakReference " + id); }}
Java的特点有哪些
Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。2.Java具有简单性、面向对象、分布式、安全性、平台独立与可移植性、动态性等特点。3.使用Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
以上就是怎么在Java中实现引用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。