`
pouyang
  • 浏览: 320103 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java WeakHashMap

    博客分类:
  • Java
阅读更多
转自:http://blog.csdn.net/bio_go/archive/2009/05/11/4165106.aspx
基本上说,引用对象提供了一种对象间接引用所需内存的方式,这些引用对象保存在一个引用对象中(类ReferenceQuene),它监视这些引用对象使得其可以访问。基于这种类型的引用对象,垃圾回收器能够释放内存,而一般的对象引用则可能无法释放。
在Java中,有四种类型的对象引用。常用的是直接引用,如:
Object obj = new Object()
您可以将直接引用当作一种无需额外的代码去创建或访问对象的一种强引用。接下来的三种类型的引用是java.lang.ref包中的Reference类的子类。软引用(Soft reference)由SoftReference类提供,弱引用(weak reference)由WeakReference类提供,幻像引用(PhantomReference)由PhantomReference提供。
软引用的工作方式很像数据缓存。当系统内存太低的时候,GC可以任意地释放软引用所引用的对象。换句话说,如果一个对象没有强引用,那么这个对象就是一个候选释放对象。在抛出OutOfMemoryException异常之前,GC将要求释放任何软引用。

弱引用比软引用弱。如果对象的引用只有弱引用,则GC将可能在任何时候回收内存,而不需要等到内存不足的时候。典型的动作是GC在下一个回收周期中对象的内存被回收。
幻像引用与清理任务有关。他们提供了一种在GC执行终止程序和释放对象之前即时通知机制。将其理解为在一个对象之前进行的清理任务。
下面是WeakHashMap的一个简单示例。WeakTest程序创建一个WeakHashMap的对象,里面含有一个元素。接着创建了第二个线程等待map清空,要求GC每0.5秒执行一次。主线程等待第二线程完成。
import java.util.*;
   public class WeakTest {
     private static Map<String, String> map;
     public static void main (String args[]) {
       map = new WeakHashMap<String, String>();
       map.put(new String("Scott"), "McNealey");
       Runnable runner = new Runnable() {
         public void run() {
           while (map.containsKey("Scott")) {
             try {
               Thread.sleep(500);
             } catch (InterruptedException ignored) {
             }
             System.out.println("Checking for empty");
             System.gc();
           }
         }
       };
       Thread t = new Thread(runner);
       t.start();
       System.out.println("Main joining");
       try {
         t.join();
       } catch (InterruptedException ignored) {
       }
     }
   }
因为在map仅有一个键没有强引用,在map中的项会在最近的一个垃圾回收周期内回收。
运行该程序将输出:
Main joining
Checking for empty
有两个重要的地方需要指出。第一,正常情况下System.gc()不需要明确地调用。但是因为WeakTest是一个非常轻量级的程序,它不需要使用更多的内存,因此明确地调用垃圾回收机制是必要的。第二,注意到new String("Scott")这一行,你可能会问为什么不直接使用"Scott"而需要new呢?答案是如果你不使用new,那么作为map的键的该字符串在系统的字符串常量池中有一个引用。这将不会移除,所以弱引用也不会释放。为了解决这个问题,需要使用new创建一个特定的引用去引用字符串常量池中的引用。字符串的内容不会重复。它们保留在常量池中。这只是简单地创建了一个单独的指针指向该字符串。


分享到:
评论

相关推荐

    java集合-WeakHashMap的使用

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

    Java编程WeakHashMap实例解析

    Java编程WeakHashMap实例解析 WeakHashMap是Java编程中的一种特殊的HashMap实现,它使用弱引用来保存键和值,这样可以使得垃圾回收器自动清理键和值。在WeakHashMap中,键和值都是弱引用的,这样可以避免内存泄露...

    10分钟带你理解Java中的弱引用

    Java中的弱引用是一种特殊的引用类型,它在内存管理中扮演着重要的角色,特别是在避免内存泄漏和优化资源使用方面。本文将从三个方面详细解释弱引用:What(定义)、Why(使用原因)和How(使用方法)。 一、What...

    WeakHashMap的使用方法详解

    WeakHashMap是Java中的一种哈希映射表,它的键是弱引用的,意味着当 WeakHashMap 的键对象只有 WeakHashMap 自己持有时,垃圾回收器可以将其回收。WeakHashMap 的使用方法主要体现在以下几个方面: 1. WeakHashMap...

    Java弱引用与WeakHashMap

    书中还提到可以用WeakHashMap来作为缓存的容器可以有效解决这一问题。之前也确实遇到过类似问题,但是没有接触过“弱引用”相关的问题,于是查阅了一些资料。  《Java 理论与实践: 用弱引用堵住内存泄漏》一文也...

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

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

    Java内置观察者模式

    Java 1.6后提供了`WeakHashMap`,可以用于存储弱引用的观察者。 - **多参数通知**:默认的`update`方法只传递了一个`Object`参数,可能无法满足复杂场景的需求。可以通过自定义参数类型或使用`java.util.EventObject...

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

    7. **缓存机制**:为了提升性能,系统可能使用了内存缓存,如Java的WeakHashMap或Guava Cache,将频繁访问的数据暂存于内存中,减少对硬盘的访问。 8. **权限管理**:管理员账号的设置涉及权限控制,系统可能使用了...

    Java 基础核心总结.pdf

    WeakHashMap和IdentityHashMap则提供了特殊的键值映射策略。 此外,Java的I/O流系统支持字符和字节流,如File类处理文件操作,InputStream和OutputStream处理字节流,Reader和Writer处理字符流。null是Java中的特殊...

    Java基础核心总结.PDF

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

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

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

    Java集合详解,详细讲解java的集合类

    Java集合框架是Java编程语言中的核心部分,它提供了一种高效、灵活的方式来组织和操作对象的集合。在Java中,集合主要分为两大类:Collection和Map。本文将深入讲解Java集合类,特别是Collection接口和其下的List、...

    java 9.27_java_

    在内存模型方面,Java 9引入了弱引用关联映射表(`WeakHashMap`)的新实现,这在处理内存敏感的应用场景中更有优势。 最后,Java 9对Javadoc也进行了改进,支持Markdown语法,使得文档注释更加易读和格式化。 总的来...

    Java基础核心知识点总结(79页).pdf

    HashMap、TreeMap、LinkedHashMap、Hashtable、IdentityHashMap、WeakHashMap是不同的映射结构,它们用于存储键值对。Collections类提供了集合操作的静态方法,如排序、查找、转换等。 Java还支持泛型,用于在编译...

    java集合与通用集合

    Java集合与通用集合是Java编程中的重要组成部分,主要用于存储和管理对象。集合框架自Java 1.2引入以来,已经成为Java开发中不可或缺的工具。在Java高级编程中,理解并熟练掌握集合的使用至关重要。 首先,集合框架...

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

    而WeakHashMap则使用弱引用作为键,当键不再被引用时,键值对会自动从映射中移除。 PPT可能涵盖了这些接口的详细特性,包括它们的实现类、操作方法、性能分析,以及如何根据实际需求选择合适的集合类型。此外,还...

    Java所有课程超全学习笔记

    2.2 Map接口:HashMap、LinkedHashMap、TreeMap、WeakHashMap及其用法。 2.3 集合操作:遍历、添加、删除元素,集合转换,流式API等。 三、IO与NIO 3.1 字节流和字符流:FileInputStream、FileOutputStream、...

    java 集合部分笔记

    其他实现如LinkedHashMap保持插入顺序,WeakHashMap使用弱引用,IdentityHashMap比较对象的内存地址而非equals()。 示例代码: ```java // 创建ArrayList并添加元素 List&lt;String&gt; list = new ArrayList(); list.add...

    疯狂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 查找,替换...

Global site tag (gtag.js) - Google Analytics