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]包中定义 ...
随机推荐
- 超级基础的python文件读取
读取文件的两种方式: 1.使用os的open函数: import sys,os r=open("data1.txt","r+") fr=r.readlines( ...
- iOS音频采集过程中的音效实现
1.背景 在移动直播中, 声音是主播和观众互动的重要途径之一, 为了丰富直播的内容,大家都会想要在声音上做一些文章, 在采集录音的基础上玩一些花样. 比如演唱类的直播间中, 主播伴随着背景音乐演唱. ...
- MySQL 单实例编译安装 以及多实例安装简介
这是基本的安装教程,与牛逼的大神无关,或许是牛逼大神不用看就会安装吧. CentOS 6.5 Final x86_64 一.预安装软件包 1.开发包组合安装 yum groupinstall &qu ...
- Bootstrap File Input的简单使用
安装引入 使用前需要引入其css和js文件, 注意引入路径的问题 <link rel="stylesheet" href="/__PUB__/fileinput/c ...
- Head First设计模式之组合模式
一.定义 将对象组合成树形结构来表现"整体-部分"层次结构. 组合能让客户以一致的方法处理个别对象以及组合对象. 主要部分可以被一致对待问题. 在使用组合模式中需要注意一点也是组合 ...
- QQ音乐API-借他人之力实现我的音乐盒
好久没有写博客了,最近升级做爸爸了,很开心的事情.内心又很忧郁,怎么能给媳妇和儿子一个相对好的物质经济条件.现在什么都没有的我,至少还有你们. 话不多说了,这篇博客还是和自己用vue做web app相 ...
- 第四章 go语言 数组、切片和映射
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ 数组是由同构的元素组成.结构体是由异构的元素组成.数据和结构体都是有固定内存大小的数 ...
- css中的相对定位与绝对定位
之前说过了CSS有三种基本的布局机制:普通流.浮动和绝对定位.除非专门指定,否则所有的框都在普通流中定位.而普通流中元素框的位置由元素在HTML中的位置决定. 相对定位 相对定位实际上被看做普通流定位 ...
- 【分享】2017 开源中国新增开源项目排行榜 TOP 100
2017 年开源中国社区新增开源项目排行榜 TOP 100 新鲜出炉! 这份榜单根据 2017 年开源中国社区新收录的开源项目的关注度和活跃度整理而来,这份最受关注的 100 款开源项目榜单在一定程度 ...
- 日期插件-flatpickr
github的仓库地址:https://github.com/chmln/flatpickr 手册地址:http://www.htmleaf.com/Demo/201608213895.html ...