`

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 内存分析工具

    3. **散列映射视图**:提供键值对形式的数据,帮助分析集合类如HashMap或WeakHashMap的内存占用情况。 4. ** Leak Suspects 报告**:MAT会自动分析dump文件并生成报告,列出可能导致内存泄漏的嫌疑人,包括无法释放...

    Java 常用数据结构分析

    以下是对这些数据结构及其在Java中的具体实现的详细分析: 1. **线性表**: - **ArrayList**: 作为线性表的一种实现,ArrayList是一个动态数组,它允许快速的随机访问(O(1)时间复杂度)。通过索引可以快速获取...

    java数据结构课件与分析

    本课件集合主要针对Java中的数据结构及其算法进行了深入的探讨和分析。 在"java数据结构课件与分析"中,我们可以期待学习到以下几个关键的知识点: 1. **数组**:Java中的基础数据结构,用于存储固定数量的相同...

    Java弱引用与WeakHashMap

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

    JAVA进程占用高内存缘由分析与优化方法_.docx

    可以使用 Java 的 API 来实现对象的缓存,例如使用 WeakHashMap 来实现缓存。 7. profiling 工具的使用 profiling 工具是优化 Java 进程的内存占用的一种重要方法。例如,可以使用 VisualVM、JProfiler 等 ...

    简易人员管理系统(纯Java版)

    通过以上分析,我们可以看出,这个“简易人员管理系统(纯Java版)”不仅涵盖了Java编程的基础知识,还涉及到软件设计的多个层面,包括用户交互、数据管理、性能优化以及安全性控制。对于学习和理解Java开发有很好的...

    Java基础核心总结.PDF

    Java的集合框架包括List(如ArrayList、LinkedList和Vector)、Set(如HashSet、TreeSet、LinkedHashSet和PriorityQueue)、Map(如HashMap、TreeMap、LinkedHashMap、Hashtable、IdentityHashMap、WeakHashMap)...

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

    在Java编程中,WeakHashMap是一种特殊的哈希表,它的键(Key)是弱引用,当键被垃圾回收器清除后,即使有值(Value)存在,该条目也会自动从哈希表中移除。 线程死锁的原因通常包括以下几点: 1. **资源互斥**:每...

    java避免内存泄露

    ### Java避免内存泄露的关键知识点 ...通过以上分析,我们可以了解到在Java中避免内存泄露的一些关键策略和技术要点。正确地管理资源和引用,不仅可以提升程序的健壮性,还能提高系统的整体性能。

    一个讲解很清晰的Java集合框架PPT

    PPT可能涵盖了这些接口的详细特性,包括它们的实现类、操作方法、性能分析,以及如何根据实际需求选择合适的集合类型。此外,还可能讲解到泛型、迭代器、并发集合(如ConcurrentHashMap)等内容,这些都是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 查找,替换...

    JAVA容器对象整理

    这些知识点仅仅是Java容器对象的一部分,实际的博客可能会包含更多细节,如源码分析、性能对比和最佳实践。通过阅读博客中的`持有对象.xmind`文件,可以进一步了解博主对这些概念的详细整理和分类。如果你对Java容器...

    Java核心知识点整理_java_

    3. 内存分析:分析内存泄露、对象生命周期和内存消耗,帮助优化代码和配置。 五、其他高级特性 1. 泛型:提供类型安全的集合,避免强制类型转换。 2. 异常处理:try-catch-finally结构,用于捕获和处理异常。 3. ...

    java程序性能优化

    6. **监控与分析**:使用工具如VisualVM、JProfiler、YourKit等进行性能监控,分析CPU、内存、线程等状况,找出性能瓶颈。日志和Profiling可以帮助定位问题,而AOP(面向切面编程)可以用于记录方法执行时间,便于...

    Java进阶路线

    - **Jconsole/VisualVM/jps/jstat/jstack/jmap/jhat/jmeter**:这些工具可以帮助监控和分析应用程序的性能。 #### 十一、Java Web开发 Java Web开发涵盖了从架构设计到具体技术实现的多个方面: - **MVC**:模型-...

    从DELPHI到JAVA转换.docx

    本文将从字符串处理、数组、集合、Key/Value存储、多线程同步、文件操作和目录操作等方面对Delphi和Java的差异进行比较和分析。 1. 字符串处理 在Delphi中,字符串处理使用var关键字声明的字符串变量,例如:`var...

    Java集合源码全面分析

    在本文中,我们将全面分析Java集合框架的核心概念和实现细节。 首先,Java集合框架的基础是`Collection`接口,它是所有集合类的根接口,定义了集合的基本操作。`Collection`接口有两个重要的子接口:`List`和`Set`...

    2018最新Java面试题详细版.zip_2018 面试_E98_Java面试题2018_java2018面试_java面试

    - **垃圾回收(GC)**:理解Java的自动内存管理机制,知道如何分析和优化GC性能。 2. **类与对象** - **构造器**:了解构造器的作用,掌握构造器的重载和实例化过程。 - **访问修饰符**:理解public、private、...

    java 引用相关文档

    工具如VisualVM或JProfiler可以帮助开发者监控和分析Java应用的内存状态,更好地理解引用类型的作用。 通过阅读“java 引用相关文档”,开发者可以深入理解Java引用机制,提升对内存管理的掌控能力,从而编写出更加...

    Java面试题集锦

    根据给定的文件信息,以下是对“Java面试题集锦”中的关键知识点的详细解析: ...通过以上分析,我们可以看到Java面试题集锦覆盖了从基础概念到高级特性的广泛知识点,对准备Java面试的人来说是非常宝贵的资源。

Global site tag (gtag.js) - Google Analytics