Java的引用类型(附图说明)
来源:互联网 发布:网络阅卷注意事项 编辑:程序博客网 时间:2024/06/11 09:12
本章的主要内容来自:javaconceptoftheday 一小部分是自己整理的,英文OK的可以直接读原文
Java的一个优点是程序员不需要关心内存是如何被分配的,Java有一套自己的机制去管理它,程序员不需要考虑当对象不用时要释放该内存。垃圾回收器会有一套自己的算法去负责何时清理垃圾,我们无法控制垃圾回收器怎样回收垃圾,但我们能够通过灵活地使用Java的引用类型在一定程度上控制内存的分配。
Java引用类型分为
- Strong Reference(强引用)
- Soft Reference(软引用)
- Weak Reference( 弱引用)
- 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变量置null a = null; //你可以通过Reference.get()方法来恢复a a = 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; //总是返回null a = phantomA.get(); } }}
- Java的引用类型(附图说明)
- java的引用类型
- Java的引用类型
- java 的引用类型
- java引用的类型
- java的引用类型
- java 函数参数的传递方式说明(string、 引用类型、基本类型)
- java 引用类型的介绍
- java对象的引用类型
- Java引用变量的类型
- java 引用类型的概念
- java对象引用的类型
- Java的引用类型转换
- java引用类型的应用
- Java的引用类型和原始类型
- java引用类型的强制类型转换
- Java的基本类型和引用类型
- java引用类型的强制类型转换
- 博客第一天......
- solr DataImportHandler (数据相关操作)
- jstack,用于检测死锁
- ListView的优化
- Unity中用触摸控制物体旋转和放大
- Java的引用类型(附图说明)
- Internal Sorting: Straight selection sort: Sorting by Selection
- TalkingData美国旧金山之行 —— Twitter
- Source Insight上添加svn命令,打开当前文件夹命令
- Python之学习笔记(模块的使用)
- Log4net 初识及简单使用
- POJ2001 -- 字典树和字符串的前缀
- SCM知识拓展
- Java回忆录(八)--------异常处理