`

Java WeakHashMap 分析

    博客分类:
  • Java
阅读更多
昨天在我们的系统中看到了这样的一行代码:
private final Map<String, String> CACHE = new WeakHashMap();


对于
WeakHashMap
而言,之前还真的没有听过, 惭愧啊!晚上就好好的研究了下,这个不对不说说强引用、软引用、弱引用、虚引用以及垃圾回收了。

1. 强引用、软引用、弱引用、虚引用

1)强引用:就是我们平时写的new了,如Object o = new Object(),这里有两点请注意,一个是o,另一个是Object。这里假设这行代码是在方法体里写的(局部和全局是有相当大的区别的),那么o就是存储在栈空间里,而Object对象是存储在堆空间里,o就是Object对象的引用了。如果o的生命周期一直存在,那么Object对象是一直不会被回收的,即使空间不足了,它也不会回收,宁愿抛出 OutOfMemery的异常。现在是写在方法体里了,当调用这个方法结束时,o的生命周期就结束了,此时Ojbect对象就没有引用了,垃圾回收器就会将它进行回收,具体在什么时候回收,我们就不得而知了。

2)软引用:它的特征是空间足够,不会回收,空间不足够,就会回收。垃圾回收器在回收之前做了一个操作,就是将其引用置为null了。

3)弱引用:它的特征是不管空间是否足够,它都有可能被会垃圾回收器回收。

4)虚引用:它本质是在垃圾回收后进行一定的辅助操作,它不涉及对象的生命周期。

2.WeakHashMap
  WeakHashMap,从字面上看,就知道,它是一个弱引用,它其实也是一个Map,不过它有一个特征就是:当key的对象不可用时,它的key-value就会被回收。这里的不可用,是什么意思呢?就是这个key的对象是非强引用时,它就会变成不可用。下面会给出相应的例子来讲解。

public static void main(String args[]) throws ClassNotFoundException, SQLException, InterruptedException {
		Map<String, String> cache = new WeakHashMap();
		String key=null;
		try(Connection connection = DBConnection.getConnection()){
        		try (PreparedStatement pstmt = connection
    					.prepareStatement("SELECT F01,F02 FROM Table LIMIT 1")) {
        			try (ResultSet resultSet = pstmt.executeQuery()) {
    					if (resultSet.next()) {
    						System.out.println("F01 = " +resultSet.getString(1));
    					//	key=resultSet.getString(1);    // --(1)
    					//	cache.put(key, resultSet.getString(2));  // --(2)
    						cache.put(resultSet.getString(1),resultSet.getString(2));   // --(3)
    					}
    				}
        		}	
          }
		
		while(true){
			System.gc();
			Thread.sleep(50000);
			System.out.println("get value:"+cache.get("BAOFUPAY.BF_CHARGE_PAGEURL"));
			
		}
	}


请注意:

1)如果将 1),2)注释掉,则输出的结果为null;
2)如果将3)注释掉,1) 2) 打开则输出的结果为key的value值。


怎么是这样的呢?这是因为
resultSet.getString(1)
,它是匿名对象,是没有引用的,这个key很快就会变成不可用,如果有一个key的变量,如上面所写,
key=resultSet.getString(1)
,它就变成了一个强引用了,此时就不可能被回收了。
分享到:
评论

相关推荐

    java集合-WeakHashMap的使用

    WeakHashMap是Java中的一种特殊的哈希表实现,它使用弱引用(Weak Reference)来保存键对象。当键对象没有被其他强引用引用时,在垃圾回收时会自动从WeakHashMap中移除对应的键值对。

    Java编程WeakHashMap实例解析

    主要介绍了Java编程WeakHashMap实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    Java弱引用与WeakHashMap

     《Java 理论与实践: 用弱引用堵住内存泄漏》一文也指出了使用全局的Map作为缓存容器时发生的内存泄露问题,介绍了如何使用hprof工具来找出内存泄露,并分析了如何使用弱引用来防止内存泄露,还分析了

    清华妹子的Java仓库(进阶学习路线)

    本仓库记录了我的Java学习进阶之路,涵盖了Java基础、JDK源码、JVM中的重要知识,附有代码和博客讲解,旨在提供一个Java在线共享学习平台,帮助更多的...Java集合框架源码解读(4)——WeakHashMap Java集合框架源码解读

    Java 基础核心总结 +经典算法大全.rar

    《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else ...

    Java优化编程(第2版)

    展示了如何提升Java应用性能,并且给出了优化前与优化后的Java应用程序的性能差别,以实际的实例与数字告诉你,为什么不可以这么做,应该怎么做,深入分析了影响Java应用程序性能的根本原因。本书不是教你怎样使用...

    疯狂JAVA讲义

    7.6.3 WeakHashMap实现类 279 7.6.4 IdentityHashMap实现类 280 7.6.5 EnumMap实现类 281 7.7 HashSet和HashMap的性能选项 282 7.8 操作集合的工具类:Collections 283 7.8.1 排序操作 283 7.8.2 查找,替换...

    WeakHashMap的使用方法详解

    主要介绍了WeakHashMap的使用方法详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

    解析WeakHashMap与HashMap的区别详解

    本篇文章是对WeakHashMap与HashMap的区别进行了详细的分析介绍,需要的朋友参考下

    java集合框架 解析

    java集合框架 3.6. LinkedHashSet类 4. Map接口 4.1. Map.Entry接口 4.2. SortedMap接口 4.3. AbstractMap抽象类 4.4. HashMap类和TreeMap类 4.4.1. HashMap类 4.4.2. TreeMap类 4.5. LinkedHashMap类 4.6. ...

    线程死锁CPU过高,请求原因分析

    线程死锁 CPU过高 WeakHashMap 请求原因分析

    javabitset源码-JerrySoundCode:杰瑞声码

    bitset源码Java源码分析 基础集合列表 ArrayList (done) Vector (done) LinkedList (done) Stack (done) ReferenceQueue (done) ArrayDeque (done) Set HashSet (done) TreeSet (done) LinkedHashSet (done) BitSet ...

    Java期末复习-类集框架

    Java类集框架 最大单值操作父接口Collection及其子接口、子类: List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、HashSet类、TreeSet类、SortedSet接口 双值操作...

    Java集合类操作优化经验总结

    本文首先针对 Java 集合接口进行了一些介绍,并对这些接口的实现类进行详细描述,包括 LinkedList、ArrayList、Vector、Stack、Hashtable、HashMap、WeakHashMap 等,然后对一些实现类的实现方式和使用经验进行讲解...

    超全Java集合框架讲解.md

    - WeakHashMap - Hashtable - Collection 集合体系详解 - Set 接口 - AbstractSet 抽象类 - SortedSet 接口 - HashSet - LinkedHashSet - TreeSet - List 接口 - AbstractList 和 AbstractSequentialList...

    Thinking in Java 4th Edition

    Java SE5 and SE6 .................. 2 Java SE6 ......................................... 2 The 4th edition........................ 2 Changes .......................................... 3 Note on the ...

    picketlink-jbas-common-2.6.0.CR4.zip

    Java-WeakIdentityHashMap.zip,weakhashmap identityhashmapa独立库的组合,用于weakidantityhashmap实现内/外字段

    WeakObjectPool:用于在对象生命周期中将对象附加到对象(即装饰器)的池

    您是否曾经尝试过在运行时扩展Java对象?解决方案WeakObjectPool :用于保存和扩展[弱引用的对象]的池( “ title =” WeakReference JavaDoc) 。 这与有何不同? 这里有几个关键的区别,它们有效地定义了...

    各种集合的总结

    总结了集合中常用的一点点,希望可以共享 List:LinkedList,ArrayList,Vector(Stack),Set Map:Hashtable,HashMap,WeakHashMap

    javalruleetcode-dsal:数据结构与算法个人整理

    java lru leetcode 基础算法 快速排序: 随机枢纽元快排、三路快排、三数中值快排 归并排序: 自顶向下归并、自底向上归并、链表的归并排序 堆排序: 下沉构建堆、赋值确定位置下沉 二分查找: 查找第一次后最后一次出现...

Global site tag (gtag.js) - Google Analytics