Java 中的 Reference

 1、强引用(StrongReference)

    强引用不会被GC回收,并且在java.lang.ref里也没有实际的对应类型。举个例子来说:
    Object obj = new Object();
    这里的obj引用便是一个强引用,不会被GC回收。

  2、软引用(SoftReference)

    软引用在JVM报告内存不足的时候才会被GC回收,否则不会回收,正是由于这种特性软引用在caching和pooling中用处广泛。软引用的用法:

Object obj = new Object();
SoftReference<Object> softRef = new SoftReference(obj);
// 使用 softRef.get() 获取软引用所引用的对象
Object objg = softRef.get();

  3、弱引用(WeakReference)

    当GC一但发现了弱引用对象,将会释放WeakReference所引用的对象。弱引用使用方法与软引用类似,但回收策略不同。

  4、虚引用(PhantomReference)

    当GC一但发现了虚引用对象,将会将PhantomReference对象插入ReferenceQueue队列,而此时PhantomReference所指向的对象并没有被GC回收,而是要等到ReferenceQueue被你真正的处理后才会被回收。虚引用的用法:

package com.asiainfo.proxydemo;import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;public class SoftReferenceDemo {//软引用在JVM报告内存不足的时候才会被GC回收,否则不会回收,正是由于这种特性软引用在caching和pooling中用处广泛。软引用的用法public static void soft(){Object obj = new Object();ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();SoftReference<Object> softRef = new SoftReference<Object>(obj, refQueue);System.out.println(softRef.get()); // java.lang.Object@f9f9d8System.out.println(refQueue.poll());// null// 清除强引用,触发GCobj = null;System.gc();System.out.println(softRef.get());try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(refQueue.poll());}//当GC一但发现了弱引用对象,将会释放WeakReference所引用的对象。弱引用使用方法与软引用类似,但回收策略不同。public static void weak(){Object obj = new Object();ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();WeakReference<Object> weakRef = new WeakReference<Object>(obj, refQueue);System.out.println(weakRef.get());System.out.println(refQueue.poll());obj = null;System.gc();System.out.println(weakRef.get());System.out.println(refQueue.poll());}// 如果obj被置为null,当GC发现了虚引用,GC会将phanRef插入进我们之前创建时传入的refQueue队列// 注意,此时phanRef所引用的obj对象,并没有被GC回收,在我们显式地调用refQueue.poll返回phanRef之后// 当GC第二次发现虚引用,而此时JVM将phanRef插入到refQueue会插入失败,此时GC才会对obj进行回收public static void phantom() throws InterruptedException{Object obj = new Object();ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();PhantomReference<Object> phanRef = new PhantomReference<Object>(obj, refQueue);/// 调用phanRef.get()不管在什么情况下会一直返回nullSystem.out.println(phanRef.get());System.out.println(refQueue.poll());obj = null;System.gc();System.out.println(phanRef.get());System.out.println(refQueue.poll());Thread.sleep(300);System.out.println(refQueue.poll());}public static void main(String[] args) {try {SoftReferenceDemo.phantom();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

弱引用与虚引用的用处

  软引用很明显可以用来制作caching和pooling,而弱引用与虚引用呢?其实用处也很大,首先我们来看看弱引用,举个例子:

class Registry {private Set registeredObjects = new HashSet();public void register(Object object) {registeredObjects.add( object );}
}

所有我添加进 registeredObjects 中的object永远不会被GC回收,因为这里有个强引用保存在registeredObjects里,另一方面如果我把代码改为如下:

class Registry {private Set registeredObjects = new HashSet();public void register(Object object) {registeredObjects.add( new WeakReference(object) );}}

现在如果GC想要回收registeredObjects中的object,便能够实现了,同样在使用HashMap如果想实现如上的效果,一种更好的实现是使用WeakHashMap。

而虚引用呢?我们先来看看javadoc的部分说明:

Phantom references are useful for implementing cleanup operations that are necessary before an object gets garbage-collected. They are sometimes more flexible than the finalize() method.

翻译一下:

虚引用在实现一个对象被回收之前必须做清理操作是很有用的。有时候,他们比finalize()方法更灵活。

很明显的,虚引用可以用来做对象被回收之前的清理工作

参考:http://www.cnblogs.com/newcj/archive/2011/05/15/2046882.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转贴]暴雪的霸王条款是否合理?

暴雪的霸王条款是否合理&#xff1f; 类似于这样的霸王条款很多&#xff0c;但暴雪是个典型&#xff0c;谁让暴雪树大招风呢&#xff1f;暴雪蛮横地宣布游戏中的所有数据归暴雪所有&#xff0c;那么自然也包括玩家辛辛苦苦所得来的虚拟财产&#xff0c;暴雪这样做无疑是出于以下…

Java 中常用缓存Cache机制的实现

转&#xff1a;https://www.cnblogs.com/JAYIT/p/5647924.html 所谓缓存&#xff0c;就是将程序或系统经常要调用的对象存在内存中&#xff0c;一遍其使用时可以快速调用&#xff0c;不必再去创建新的重复的实例。这样做可以减少系统开销&#xff0c;提高系统效率。 所谓缓存&…

巧用小程序·云开发实现邮件发送功能丨实战

先看效果图&#xff1a; 通过上面的日志&#xff0c;可以看出我们是158开头的邮箱给250开头的邮箱发送邮件&#xff0c;下面是成功接收到的邮件。 准备工作 1、qq邮箱一个2、开通你的qq邮箱的授权码&#xff08;会具体讲解&#xff09;3、注册自己的小程序&#xff08;因为只有…

shiro学习(10):servelet实现权限认证一

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 在pom.xml里面添加 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.2.3</version></dep…

JAVA多线程及线程状态转换

转发:https://www.cnblogs.com/nwnu-daizh/p/8036156.html 以下内容整理自&#xff1a;http://blog.csdn.net/wtyvhreal/article/details/44176369 线程&#xff1a;是指进程中的一个执行流程。 线程与进程的区别&#xff1a;每个进程都需要操作系统为其分配独立的内存地址空…

shiro学习(11):servelet实现权限认证二

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 在pom.xml里面添加 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.2.3</version></dep…

[MOSS开发]:如何使用用户控件

如果是纯手工开发web part&#xff0c;其实还是比较困难的&#xff0c;因为这种类型的web part是以类库的形式出现&#xff0c;没有可视化的界面&#xff0c;完全由代码写出来&#xff0c;包含控件的样式&#xff0c;属性&#xff0c;事件等等。开发过自定义控件的朋友可能会感…

shiro学习(12)No WebApplicationContext found:

java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:252) 解决 web.xml缺少了Spring监听器&#x…

Java 的Runnable和Callable的区别

Runnable和Callable的区别是&#xff0c;(1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值&#xff0c;而Runnable的任务是不能返回值得(3)call方法可以抛出异常&#xff0c;run方法不可以(4)运行Callable任务可以拿到一个Future对象…

Spring Boot----整合SpringCloud

首先比较一下Zookeeper和Eureka的区别&#xff1f; 1、CAP&#xff1a;C&#xff1a;强一致性&#xff0c;A&#xff1a;高可用性&#xff0c;P&#xff1a;分区容错性(分布式中必须有) CAP理论的核心是&#xff1a;一个分布式系统不可能同时很好的满足一致性&#xff0c;可用性…

[原创]利用Powerdesinger同步数据库的方法说明

本文主要介绍我在工作过程中如果利用PowerDesinger同步数据库设计PDM和物理数据库保持同步。PowerDesinger以下简称PD.我们经常在数据库生成后&#xff0c;在后续的开发中发现数据设计有遗漏&#xff0c;或者是少字段&#xff0c;或者是参照完整性不一致&#xff0c;那么我们都…

shiro学习(13):springMVC结合shiro完成认证

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3…

分布式环境下,怎么保证线程安全

转:https://blog.csdn.net/Faker_Wang/article/details/80798732 避免并发 在分布式环境中&#xff0c;如果存在并发问题&#xff0c;那么很难通过技术去解决&#xff0c;或者解决的代价很大&#xff0c;所以我们首先要想想是不是可以通过某些策略和业务设计来避免并发。比如…

用小程序·云开发两天搭建mini论坛丨实战

笔者最近涉猎了小程序相关的知识&#xff0c;于是利用周末时间开发了一款类似于同事的小程序&#xff0c;深度体验了小程序云开发模式提供的云函数、数据库、存储三大能力。关于云开发&#xff0c;可参考文档&#xff1a;小程序云开发。 个人感觉云开发带来的最大好处是鉴权流程…

shiro学习(14):springMVC结合shiro完成认证

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3…

mysql聚合函数rollup和cube

转:https://blog.csdn.net/liuxiao723846/article/details/48970443 一、with rollup&#xff1a; with rollup 通常和group by 语句一起使用&#xff0c;是根据维度在分组的结果集中进行聚合操作。——对group by的分组进行汇总。 假设用户需要对N个纬度进行聚合查询操作&am…

在C#里,如何执行cmd里的常用dos命令 (转)

http://blogger.org.cn/blog/more.asp?namenrzj&id4280 using System; using System.Diagnostics; namespace Tipo.Tools.Utility { /// <summary> /// 常用Dos命令操作 /// </summary> public class DosCommand { private Process processnull; pri…

Spring Boot----监控管理

用来监控spring 项目信息的 1、创建项目 1.1 启动项目 转载于:https://www.cnblogs.com/yanxiaoge/p/11400734.html

shiro学习(15):使用注解实现权限认证和后台管理

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3…

什么是索引?索引类型有几种,各有什么特点?

转发: 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;例如 employee 表的姓&#xff08;name&#xff09;列。如果要按姓查找特定职员&#xff0c;与必须搜索表中的所有行相比&#xff0c;索引会帮助您更快地获得该信息。 索引是一个单独的、物理的数据库结…