本章的主要内容来自:javaconceptoftheday 一小部分是自己整理的,英文OK的可以直接读原文

Java的一个优点是程序员不需要关心内存是如何被分配的,Java有一套自己的机制去管理它,程序员不需要考虑当对象不用时要释放该内存。垃圾回收器会有一套自己的算法去负责何时清理垃圾,我们无法控制垃圾回收器怎样回收垃圾,但我们能够通过灵活地使用Java的引用类型在一定程度上控制内存的分配。
Java引用类型分为

  1. Strong Reference(强引用)
  2. Soft Reference(软引用)
  3. Weak Reference( 弱引用)
  4. Phantom Reference(虚引用)

强引用

这种引用类型我们几乎每天都能看到(如果你在coding时),任何对象只要它是强引用,垃圾回收器就不会回收它,即使内存空间不足导致JVM抛出OutOfMemoryError错误以致程序异常退出。所以当你所创建的对象不再使用时最好给它置null(特别是嵌入式编程)例如,下述代码中的变量a就是强引用

class A{//class A
}
public class mainClass{public static void main(String[] args){//强引用A a = new A();  //告诉垃圾回收器a对象可以被回收了a = null;  }
}

看下面的图你会对对象在内存中如何被分配有更清晰的了解


软引用

软引用的对象一般不会被垃圾回收器回收,除非JVM非常需要内存。如果内存吃紧,软引用对象将会从内存中清除掉。下述代码向你展示如何创建一个软引用的对象

class A{//A class
}class class MainClass{public static void main(String[] args){//强引用A a = new  A(); //创建一个软引用对象,该对象指向变量a所指的对象SoftReference<A> softA = new SoftReferences<A>(a);//现在a变量置null了,但a对象不会被释放除非JVM非常需要内存a = null;    //你可以通过Reference.get()方法获取a对象a = softA.get();    }
}

下面的图会加深你对软引用的理解

注意:如果内存吃紧,软引用所指向的对象很可能被垃圾回收器回收,此时Reference.get()返回为null


弱引用

JVM会忽视弱引用,换句话说就是仅仅持有弱引用的对象是会被垃圾回收器回收的,下述代码向你展示了如何创建一个弱引用对象

class A{//A class
}public class MainClass{public static void main(String[] args){//强引用A a = new A();  //创建一个弱引用,该引用持有a对象的引用WeakReference<A> weakA = new WeakReference<A>(a);//a变量置nulla = null;//你可以通过Reference.get()方法来恢复aa = weakA.get();}
}

看下述图,你会对其有更深的理解


虚引用

被虚引用引用的对象垃圾回收器是能够回收对,但是,在回收对象前JVM会把它们放到一个叫 ‘reference queue’ 的队列。它们在调用finalize()方法后回进入reference queue,你不能通过虚引用来恢复对象,也就是说Reference.get()返回的总是null,下述代码向你展示了如何创建虚引用

class A{//A class
}public class MainClass{public static void main(String[] args){//强引用A a = new A();  //创建一个引用队列ReferenceQueue<A> refQueue = new ReferenceQueue<A>();//创建一个虚引用,并指向a所指向的地方PhantomReference<A> phantomA = new PhantomReference<A>(a, refQueue);//现在a对象能被垃圾回收器回收,但是a对象在回收前会一直保持在refQueue队列中a = null;    //总是返回nulla = phantomA.get();    }}
}   

Java的引用类型(附图说明)相关推荐

  1. Java面试题19 牛客下面有关java的引用类型,说法正确的有?

    Java面试题19下面有关java的引用类型,说法正确的有? A:对于一个对象来说,只要有强引用的存在,它就会一直存在于内存中 B:如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可 ...

  2. JAVA 【引用类型】和【对象类型】在【继承】中的异同

    介绍 JAVA [引用类型]和[对象类型]在[继承]中的异同.这个问题自己整理过N次.也被人当菜鸟问过N次.所以,在此简单整理一下.以供大家分享. 在继承关系中.一般成员变量是依据引用类型 在继承关系 ...

  3. Java 只有引用类型(reference type)

    学过java的朋友一定听过这个概念,java设计者将java的类型分为基本类型(int.string.double.long等)和引用类型(对象),基本类型使用时,是值传递,而对象类型使用时,是引用传 ...

  4. java中引用类型和基本类型的区别

    java中引用类型和基本类型的区别 一.数据类型 1.基本类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long.int.short.byte ②浮点类型:float.double ③字符类 ...

  5. Java 中引用类型都有哪些

    Java 中引用类型都有哪些 Java中对象的引用分为四种级别,这四种级别由高到低依次为:强引用.软引用.弱引用和虚 引用. 强引用( StrongReference) 如果一个对象被被人拥有强引用, ...

  6. java常见引用类型

    java的引用类型一般分为四种:强引用.软引用.弱引用.虚引用 强引用:普通的变量引用 public static User user = new User(); 软引用:将对象用SoftRefere ...

  7. java中引用类型_您真的了解Java中的4种引用类型吗?

    Java中提供了四个级别的引用:SoftReference,FinalReference,WeakReference和PhantomReference.在四种引用类型中,只有FinalReferenc ...

  8. java引用类型使用场景_下面有关java的引用类型,说法正确的有?

    发现这道题完全没头绪,就去查了一下,感觉说的比较清楚了. 四种引用类型 JDK1.2 之前,一个对象只有"已被引用"和"未被引用"两种状态,这将无法描述某些特殊 ...

  9. java强引用、软引用、弱引用、虚引用-Java的引用类型总共有四种,你都知道吗

    目录 谈引用 强引用(Strong Reference)--不回收 强引用例子 软引用(Soft Reference)--内存不足即回收 弱引用(Weak Reference)--发现即回收 面试题: ...

最新文章

  1. Android 判断是否网络连接, 判断是否为WIFI,移动网络以及跳转网络设置界面
  2. 黑莓blackberry手机刷ROM 的详细教程
  3. Trial SCN WebIDE版本下载
  4. 9.jsonp的实现原理
  5. Flume-ng HDFS sink原理解析
  6. Atheros AR9285坑爹网卡仅仅有54M/65M,开启150M速率的方法
  7. 计算机实验导论,《计算机科学导论》实验
  8. DUXCMS 2.x学习问题(一)
  9. Kotlin 中的 by lazy
  10. C++ switch怎么用
  11. 重磅:谷歌强势回归! google大会报名
  12. Linux root管理员权限
  13. HDU steps 1.2.6 Identity Card
  14. iThoughtsX for mac(优秀的思维导图软件)
  15. git 远程仓库相关命令
  16. java公众号订单查询
  17. 新北洋SNBC BTP-U81 打印机驱动
  18. Win10不显示5G网络解决方法
  19. 【245期】面试官:同类中两个方法加同步锁,多个线程支持同时访问这两个方法吗?...
  20. android 7.0 官方网址,Android7.0下载地址 安卓7.0系统手机下载安装教程

热门文章

  1. python中sin函数在哪个模块中_从零开始第5步:Python 函数和模块
  2. abstract类_012、Java的抽象方法、接口和String类
  3. 栈和队列的Java实现_栈和队列的java简单实现
  4. 博士申请 | 英国爱丁堡大学NLP组招收自然语言处理方向全奖博士生
  5. 关于NLP相关技术全部在这里:预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、语法分析、文本处理...
  6. 对抗训练硬核分析:对抗样本与模型参数的关系
  7. 工业界推荐系统必读论文:基于深度学习的推荐模型——DLRM
  8. 如何构建行业知识图谱 (以医疗行业为例)
  9. 每周一起读 × 招募 | ICML 2019:基于粒子的变分推断加速方法
  10. web第一节2020.5.11