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]包中定义 ...
随机推荐
- ElasticSearch 学习记录之ES高亮搜索
高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...
- rabbitMQ教程(三) spring整合rabbitMQ代码实例
一.开启rabbitMQ服务,导入MQ jar包和gson jar包(MQ默认的是jackson,但是效率不如Gson,所以我们用gson) 二.发送端配置,在spring配置文件中配置 <?x ...
- [数据清洗]- Pandas 清洗“脏”数据(三)
预览数据 这次我们使用 Artworks.csv ,我们选取 100 行数据来完成本次内容.具体步骤: 导入 Pandas 读取 csv 数据到 DataFrame(要确保数据已经下载到指定路径) D ...
- 房上的猫:HTML5基础
一.W3C标准 1)W3C标准不是某一个标准,而是一系列的标准的集合,一个网页主要由三部分组成,即结构(Structure),表现(Presentation)和行为(Behavior) 2)不很严谨的 ...
- Python入门-数据类型之字符串
字符串详解 没那么多废话,直接介绍字符串使用.继续往下看~~~ 字符串定义: *1.引号包围,不可变(指的是不可以对字符串进行修改)得序列(凡是能够通过索引取值的都是序列). *2.不可变对象(字符串 ...
- 公众号的Markdown排版利器:Md2All
微信公众号:颜家大少如有问题或建议,请公众号留言 本文所用排版工具:Md2All,http://md.aclickall.com 公众号排版工具 公众号的排版编辑工具还真的不少,但功能大同小异,大部分 ...
- Python模块学习------ 多线程threading(1)
# Method 1: 创建一个Thread实例,传给它一个函数:import threading from time import sleep, ctime loops = [4,2] def lo ...
- select模型
在Windows中所有的socket函数都是阻塞类型的,也就是说只有网络中有特定的事件发生时才会返回,在没有发生事件时会一直等待,虽说我们将它们设置为非阻塞状态,但是在对于服务器段而言,肯定会一直等待 ...
- Repair MySQL 5.6 GTID replication by injecting empty transactions
Since SQL_SLAVE_SKIP_COUNTER doesn’t work with GTID we need to find a way to ignore that transaction ...
- [转载]mysql绑定参数bind_param原理以及防SQL注入
假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd.. 下面我们来模拟一个用户登录的过程.. <?php $username = "aa ...