java中强,软,弱,虚引用 以及WeakHahMap
一:强软引用:
package reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.WeakHashMap;
public class ReferenceObject {
public static void main(String[] args) {
//strongToSoft();
softReferenceToReferenceQueue();
}
/**
* 强引用转软引用
* 执行完代码1,可知Student这个对象被'变量'strongRef强引用
* 执行完代码2,可知Student这个对象被'SoftReference对象'softRef软引用
* 此时有两条引用引用路径(根据对象可及性的判断,单条引用路径取最弱的一个引用决定对象的可及性,多条引用路径取最强的一条的引用决定对象的可及性)
* 所以此时的Student对象为强引用
* 执行完代码3,只剩一条引用路径,所以此时是软引用的
* 执行完代码4,通过软引用对象的get方法把Student这个对象转回强引用给anotherStrongRef变量上
* 此时的anotherStrongRef变量引用的地址还是和之前strongRef变量的地址是一样的.其实strongRef,softRef,anotherStrongRef指向堆内存地址都是一样的
* 只不过softRef是在软引用对象里再引用了Student对象信息,即对象里包含对象
* 如果softRef因内存不足而回收之后,调用get()方法就只能得到null了。
*/
public static void strongToSoft(){
Student strongRef = new Student(1, "chenyong");// 1,强引用
System.out.println("最初的强引用:"+strongRef+",hashCode:"+strongRef.hashCode());
SoftReference<Student> softRef = new SoftReference(strongRef);// 2,软引用
strongRef = null;// 3
System.out.println("软引用:"+softRef);
Object anotherStrongRef = softRef.get();// 4
System.out.println("软引用转变的强引用:"+anotherStrongRef+",hashCode:"+anotherStrongRef.hashCode());
}
/**软引用对象到引用队列
* 代码2处创建一个引用队列,用于给到代码3的机构方法中,SoftReference的机构方法有2种,带队列的与不带队列的
* 此处加上引用队列,用于对软引用对象的引用对象因内存不足而清楚后把该软引用对象加入到引用队列中
* 即当强引用strongRef被清除后,软引用softRef因内存不足导致所引用的strongRef也被清除,最后把软引用本身softRef加入到引用队列
* 代码5处通过队列的poll()方法返回队列的第一个软引用对象
* 可以再代码6中对软引用对象进行清除
*/
public static void softReferenceToReferenceQueue(){
Student strongRef = new Student(2, "chenben");// 1,强引用
System.err.println("最初的强引用:"+strongRef+",hashCode:"+strongRef.hashCode());
ReferenceQueue queue = new ReferenceQueue<>();// 2,创建引用队列
SoftReference<Student> softRef = new SoftReference(strongRef,queue);// 3,添加引用队列的软引用
strongRef = null;// 4
System.err.println("软引用:"+softRef);
System.err.println("引用队列的第一个软引用对象:"+queue.poll());// 5
//利用队列消除软引用对象
SoftReference softObject ;
while((softObject = (SoftReference) queue.poll()) != null){
// 6 清除softObject
}
}
/**
* 在Java集合中有一种特殊的Map类型—WeakHashMap,
* 在这种Map中存放了键对象的弱引用,当一个键对象被垃圾回收器回收时,那么相应的值对象的引用会从Map中删除。
* WeakHashMap能够节约存储空间,可用来缓存那些非必须存在的数据。关于Map接口的一般用法。
*/
public static void useWeakHashMap(){
WeakHashMap map = new WeakHashMap();
}
}
二:WeakHahMap与弱引用
package reference;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
/**
* 普通HashMap和WeakHahMap区别
* @author t433
*
*/
public class WeakHashMapTest {
public static void main(String[] args) {
storeToOrdernaryMap();
storeToweakHashMap();
}
/**
* 普通HashMap存储数据时,存储的都是强引用类型的,并不会因为内存不足而回收对象
* 所以内存会因为不足导致 java.lang.OutOfMemoryError: Java heap space
* 在抛出异常前map存储的第一个数据都会一直存在,并不会清楚之前存储的数据
*
* 注:在代码1处i对后面的数字取模时,假如数字较小时,要导致OutOfMemoryError需要的时间更长,
* 因为数字较小时在单位时间内程序进入if里面执行打印的次数较多,而进行map存放的次数较小 ,所以需要更长的时间来执行map.put()
*
*/
public static void storeToOrdernaryMap(){
Map<String, String> map = new HashMap<String, String>();
long i = 1;
while (i < 100000000L) {
map.put(String.valueOf(i),"java-HashMap-java");
// 测试第一个是否依然存活
if (i % 100000 == 0) {// 1
System.out.println("第"+i+"次判断普通HahMap的第1个map的值:"+map.get(String.valueOf(1)));// 大概在 3000000次时抛出异常
}
i++;
}
}
/**
* WeakHashMap将弱引用作为内部数据的存储方案
* 弱引用不像 SoftReference 需要条件(软引用对象会在内存不足时被清理,但是内存充足情况下不会清除)
* WeakHashMap存储的是弱引用对象,当内存不足时会触发垃圾回收器清理,然后垃圾回收器会清除掉弱引用对象
*/
public static void storeToweakHashMap(){
Map<String, String> map = new WeakHashMap<String, String>();
long i = 1;
while (i < 100000000L) {
map.put(String.valueOf(i),"java-WeakHashMap-java");
// 测试第一个是否依然存活
if (i % 100000 == 0) {
System.out.println("第"+i+"次判断WeakHashMap第1个map的值:"+map.get(String.valueOf(1)));// 3000000
}
i++;
}
}
}
- java中的强,软,弱,虚引用
引用的应用场景 我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型.这正是Java中弱引用和软引用的主要区别. 如果一个对象只有弱引用指向 ...
- 一道笔试题来理顺Java中的值传递和引用传递
题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...
- java中的值传递和引用传递有什么区别呀?
值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...
- Java 中的值传递和引用传递问题
Java 中的值传递和引用传递问题 public class Operation { int data = 50; void change(int data) { data = data + 100; ...
- (转)Java中的值传递和引用传递
Java中的值传递和引用传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值 ...
- Java中强、软、弱、虚引用
1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使 ...
- java中的软,弱,虚引用介绍与特性分析
java的弱,虚,软引用介绍 1.弱,虚,软引用的介绍 对于绝大部分的对象而言,在程序中是存在着一个引用变量引用该对象,这是常见的引用方式,也就是常说的 强引用,对于强引用引用的对象,系统JVM是不会 ...
- Java中的软引用、弱引用、虚引用的适用场景以及释放机制
Java的强引用,软引用,弱引用,虚引用及其使用场景 从 JDK1.2 版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引 ...
- java中的软引用,弱引用,虚引用
http://zh.wikipedia.org/wiki/%E5%BC%B1%E5%BC%95%E7%94%A8 有些语言包含多种强度的弱引用.例如Java,在java.lang.ref[1]包中定义 ...
随机推荐
- Visual Studio 我的插件
为了以后开发方便,自己记录下好用的Visual Studio 扩展 1.outline if折叠 2.Indent Guides 代码块虚线 3.CodeMaid 大文件里能够重构文件,快速定位方法. ...
- 在Ubuntu 12.04系统中安装配置OpenCV 2.4.3的方法
在Ubuntu 12.04系统中安装配置OpenCV 2.4.3的方法 对于,在Linux系统下做图像识别,不像在windows下面我们可以利用Matlab中的图像工具箱来实现,我们必须借助Ope ...
- sql sever基本查询语句
查询(*可代表全部)(<>代表不等于于)select 列名 from 表名(,隔开)where 查询条件order by 排序的列名+连接的数据类型必须兼容(结果为字符串数据的连接 , 如 ...
- Vuejs之开发环境搭建
Vue.js Vue.js是目前很火的一个前端框架,采用MVVM模式设计,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快 ...
- Integration Services 服务连接失败,拒绝访问以及无法检索数据报错问题
第一个方法比较简单:把域账号添加admin组即可: 第二种方法: 添加域账号到分布式 COM 组 命令提示符下运行 dcomcnfg.exe 下一步 下一步 启动和激活权限 下一步 访问权限 同上设置 ...
- pagelatch等待在tempdb的gsm页面上
Each data file has a gam page, sql will update it when allocate space in the file. Will see contenti ...
- unittest单元测试框架详解
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- Pycharm使用总结
1.代码整体向右移动 按住Win+TAB可以快速向右缩进一个tab 的距离,按住Shift + TAB反方向前进一个TAB距离 2.Model加入get,set 方法 在编辑框中右击,选择genera ...
- oracle PL/SQL语法基础
目录 数据类型 定义变量 PL/SQL控制结构 参考资料 Oracle10g数据类型总结 PL/SQL之基础篇 数据类型 学习总结 字符类型 char.nchar.varchar.nvarchar:有 ...
- Eclipse 配置scala开发环境(windows)
1. scala2.10.4.msi 安装 2. 配置SCALA_HOME 及path路径 SCALA_HOME C:\Program Files (x86)\scala PATH :%SCALA_H ...