您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页WeakHashMap的使用不慎导致内存溢出分析

WeakHashMap的使用不慎导致内存溢出分析

来源:飒榕旅游知识分享网
⽬前社区中有⼏个应⽤使⽤了类似Locker的代码,基本上都是从消息系统引擎中提取出来的,的区别在于消息中使⽤的Locker中的id的类型为long,⽽id在作为键被put进Map时被JVM⾃动转换成了Long,因此避免了 WeakHashMap中的键被值所引⽤。⽽如果使⽤String作为id则会因为Map中的值引⽤了⾃⼰的键,导致JVM⽆法根据键是否还被引⽤⽽清除 WeakHashMap中的entry。可通过下⾯的测试代码,清楚的观察到结果。  public class Locker {

  private static WeakHashMap lockerMap = new WeakHashMap();  private final String id;  private Locker(String id) {  this.id= id;  }

  public synchronized static Locker acquire(String id) {  Locker locker = lockerMap.get(key);  if (locker == null) {

  locker = new Locker(id);

  lockerMap.put(id, locker); //问题代码,导致了entry.key == entry.value.id

  //lockerMap.put(new String(id), locker); //这是⼀种修改⽅式,保证了WeakHashMap中的key,没有被value直接或间接所引⽤  }

  return locker;  }

  public String getId() {  return this.id;  }

  public static int getSize() {  return lockerMap.size();  }  }

  public class LockerTest extends TestCase {  public void testLocker() {

  for (int i = 0; i < 10000000; i++) {  Locker.acquire(\"abc\" + i);  if (i % 10000 == 0) {  System.gc();

  System.out.println(Locker.getSize()); //输出垃圾回收后的Map的Size  }  }  }  }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务