java引用分类
java引用分为4类,强引用、软引用、弱引用和虚引用。这四种引用跟gc的行为密切相关,gc在垃圾回收时根据引用的类型会有所不同。
强引用
强引用我们用的最多,随便new一个实例,然后用一个引用指向该实例,这个引用就是强引用了。对于强引用指向的对象,在垃圾回收时绝不会回收,即使内存不足抛出OutOfMemoryError。
软引用
SoftReference
对于软引用指向的对象,如果该对象上没有其他强引用,在垃圾回收时gc尽量不回收改对象,但在内存不足时,gc则会优先保证内存而回收掉该对象。这一点看起来好像很符合缓存的特征,gc可以根据内存使用状况决定回收与否,其实不然,如果软引用的对象的初始化过程较为耗时,我们的软引用缓存反而得不偿失。另外,引用对象给垃圾收集过程带来了一些附加的成本,每一次垃圾收集,都必须构造活跃 Reference 对象的一个列表,而且每个引用都必须做适当的处理,这给每次收集添加了一些每个 Reference 的开销,而不管该 referent 此时是否被收集。对于缓存还是建议使用一些成熟的组件如memcache、oscache等,他们都有自己的FIFO、LRU淘汰机制和过期算法,再不行就用HashMap之类的强引用,由自己根据业务的实际情况进行维护。软引用可以联合引用队列使用:
(1)String str=new String("test");
(2)ReferenceQueue<String> queue=new ReferenceQueue<String>();
(3)SoftReference<String> sf=new SoftReference<String>(str,queue);
(4)str=null;
第(2)步创建了一个引用队列,第(3)步创建一个软引用,指向”test“对象实例,并关联到引用队列queue。在第(4)步执行之前,“test”对象因为有一个str强引用故绝不会被垃圾回收;第(4)步之后,强引用str没有了,这时gc回收内存时若发现内存紧张,则会在回收掉“test”对象之前,将弱引用sf加入到引用队列queue,这时通过queue.poll()即可获得该sf。可见,只要监控联合引用队列我们就可以跟踪gc对软引用的回收情况。
弱引用
WeakReference
弱引用对象实例的生命周期比软引用还要短,在垃圾回收时,只要看到了弱引用并且也没有其他强引用指向他就坚决回收掉。同软引用一样,弱引用也可以联合引用队列一起使用来监控弱引用对象的回收情况:
(1)String str=new String("test");
(2)ReferenceQueue<String> queue=new ReferenceQueue<String>();
(3)WeakReference<String> wf=new WeakReference<String>(str,queue);
(4)str=null;
这里不再赘述。
虚引用
PhantomReference
虚引用形同虚设,并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,随时都可能被垃圾回。虚引用主要用来跟踪对象被垃圾回收的活动。不同于软引用和弱引用:虚引用必须
和引用队列联合使
用。当垃
圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是
否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动:
(1)String str=new String("test");
(2)ReferenceQueue<String> queue=new ReferenceQueue<String>();
(3)PhantomReference<String> wf=new PhantomReference<String>(str,queue);
(4)str=null;
分享到:
相关推荐
Your author likes to read reference manuals (believe it or not)—at least if they are reasonably complete—on the grounds that this is the most efficient way to absorb a language quickly.
Java in a Nutshell Java Language Reference Java AWT Reference Java Fundamental Classes Reference Exploring Java Combined Index Combined Search Web Version Credits
### Neo4j Java Reference 3.0:深入理解图数据库扩展与高级应用 #### 概述 《Neo4j Java Reference 3.0》是一本详细介绍如何使用Java语言来开发和扩展Neo4j图数据库的专业指南。本书不仅覆盖了Neo4j的核心功能,...
### 伯克利:A Java Reference —— Java概述与基础知识详解 #### 1. Java概述 本章节提供了Java编程语言的基础介绍,从程序结构、编译执行到简单值与表达式的处理进行了详尽的讲解。 ##### 1.1 基本程序结构 ...
Java reference sheet
Java Reference源码解析 Java Reference是Java语言的一种机制,用于追踪对象的可达性和垃圾回收。Java Reference源码解析主要为大家详细解析了Java Reference源码,具有一定的参考价值,感兴趣的小伙伴们可以参考...
Java: The Complete Reference, Eleventh Edition By 作者: Herbert Schildt ISBN-10 书号: 1260440230 ISBN-13 书号: 9781260440232 Edition 版本: 11 出版日期: 2018-12-12 pages 页数: (1955) The Definitive ...
在Java编程语言中,`Reference`类是一个非常特殊且重要的概念,它超出了常规的引用类型,如`Object`或数组引用。`Reference`类及其子类主要用于处理对象的软引用、弱引用和虚引用,这些引用类型在内存管理,特别是...
Java The Complete Reference, 11th Edition 9781260440232 c.pdf Java The Complete Reference, 11th Edition 9781260440232 c.pdf Java The Complete Reference, 11th Edition 9781260440232 c.pdf
在Neo4j-java-reference-3.3这份参考指南中,涵盖了多个关于如何在Java环境中使用和扩展Neo4j数据库的高级主题。文档内容涉及到如何嵌入Neo4j到Java应用中、使用Neo4j的遍历框架、手动索引、事务管理、在线备份以及...
Java The Complete Reference 10th Edition Java9 编程官方参考(第10版) 带书签 文字版
Neo4j的Java参考文档版本3.3详细介绍了如何在Java应用程序中嵌入Neo4j,扩展Neo4j的功能,并且介绍了如何使用REST API进行授权规则设置、远程调试配置、事务管理、手动索引、在线备份以及监控Neo4j的JMX指标。...
Java自发布以来,已经经历了多个版本的迭代,目前最新的稳定版为Java 14,但本文档提及的《Java The Complete Reference 9th》涉及的Java版本是第九版对应的Java技术标准。 提到的《Java The Complete Reference 9...
### Java AWT(Abstract Window Toolkit)详解:掌握Java图形用户界面设计的核心技能 #### 引言:Java AWT——构建用户界面的基石 在Java的世界里,Abstract Window Toolkit(AWT)扮演着至关重要的角色,它为Java...
在Java编程语言中,"reference"是一个至关重要的概念,它涉及到对象的引用和内存管理。在Java的世界里,"Everything is Object",这意味着所有的数据都以对象的形式存在,而reference则是连接这些对象与程序代码的...
这将是一个Java Swing应用程序,它将用作Java API名称的快速参考。 它将具有增量搜索和过滤功能,从而提高了搜索效率。 这将是非常简单并且是统计分析Java api的好方法。
《Java The Complete Reference 第九版源代码》是一个深入学习Java编程语言的重要资源。这个压缩包包含的源代码是作者在书中讲解各种Java概念和技术时所使用的示例程序,旨在帮助读者更好地理解和应用Java编程知识。...
这个压缩包中的源代码文件名为"javareference",很可能是该章节所有示例的集合。 在Java编程中,源代码是用Java语言编写的程序文本,包含了类定义、方法、变量和控制流程等元素。这些源代码经过Java编译器的处理,...
《neo4j-java-reference-3.1》是Neo4j官方发布的针对Java开发者的详细指南,旨在帮助开发者熟练地利用Java API与Neo4j图形数据库进行交互。这本书涵盖了从安装配置到高级特性的方方面面,是Java程序员在 Neo4j 领域...