• 一丨丿丶乙
    2020-11-18
    享元--->复用,线程池等。通过复用对象,以达到节省内存的目的 1.懒加载,dubble check 2.weak reference持有享元对象

    作者回复: 嗯嗯 ������

    
    1
  • 张三丰
    2020-07-31
    为什么说垃圾回收的时候如果保存了对象的"引用"就不友好,垃圾回收的依据不是只看这个对象还有没有被"使用"吗?

    作者回复: 有引用,就是在被使用啊

    
    
  • Liam
    2020-03-09
    享元池用weak reference持有享元对象
    共 7 条评论
    75
  • 小晏子
    2020-03-09
    如果IntegerCache不事先指定缓存哪些整形对象,那么每次用到的时候去new一个,这样会稍微影响一些效率,尤其在某些情况下如果常用到-128~127之间的数,可能会不停的new/delete, 不过这个性能问题在大部分时候影响不是很大,所以按照string的设计思路也是可行的, 按照这个思路设计IntegerCache类的话,如下 private static class IntegerCache { public static final WeakHashMap<Integer, WeakReference<Integer>> cache = new WeakHashMap<Integer, WeakReference<Integer>>(); //也可以提前分配容量 private IntegerCache(){} } public static Integer valueOf(int i) { final WeakReference<Integer> cached = IntegerCache.cache.get(i); if (cached != null) { final Integer value = cached.get(i); if (value != null) { return value; } } WeakReference<Integer> val = new WeakReference<Integer>(i); IntegerCache.cache.put(i, val); return val.get(); }
    展开
    共 7 条评论
    51
  • 辣么大
    2020-03-11
    谢谢各位的讨论,今天学到了软引用,弱引用,和WeakHashMap。内存吃紧的时候可以考虑使用WeakHashMap。 https://www.baeldung.com/java-weakhashmap https://www.baeldung.com/java-soft-references https://www.baeldung.com/java-weak-reference
    共 7 条评论
    47
  • 李小四
    2020-03-17
    设计模式_55: # 作业 原来还有个WeakHashMap,学习了。 # 感想 自己尝试了写了一个,然后分别测试了10,000次、100,000次,1,000,000次创建,value从1-100,100-200,10000-10100,发现不管哪个场景,总是JVM的Integer时间更短,我写的要3倍左右的时间,不禁感叹,Java二十几年了,大部分的优化应该都做了,不要期望自己花20分钟能改出超过JVM的性能。
    
    29
  • 3Spiders
    2020-03-09
    课后题。因为整型对象长度固定,且内容固定,可以直接申请一块连续的内存地址,可以加快访问,节省内存?而String类不行。
    共 1 条评论
    25
  • Geek_41d472
    2020-03-10
    我勒个擦 ,这好像是我碰到的两道面试题,包装和拆箱这道题简直就是个坑,有踩坑的举个手
    
    12
  • webmin
    2020-03-09
    抛砖引玉实现了一个有限范围的缓存(-128~2048383(127 * 127 * 127)) public class IntegerCache { private static final int bucketSize = 127; private static final int level1Max = bucketSize * bucketSize; private static final int max = bucketSize * bucketSize * bucketSize; private static final WeakHashMap<Integer, WeakHashMap<Integer, WeakHashMap<Integer,WeakReference<Integer>>>> CACHE = new WeakHashMap<>(); public static Integer intern(int integer) { if (integer <= 127) { return integer; } if (integer > max) { return integer; } synchronized (CACHE) { Integer l1 = 0; int tmp = integer; if(integer >= level1Max){ l1 = integer / level1Max; integer -= level1Max; } Integer l2 = integer / bucketSize; Integer mod = integer % bucketSize; WeakHashMap<Integer, WeakHashMap<Integer,WeakReference<Integer>>> level1 = CACHE.computeIfAbsent(l1, val -> new WeakHashMap<>()); WeakHashMap<Integer,WeakReference<Integer>> level2 = level1.computeIfAbsent(l2, val -> new WeakHashMap<>()); WeakReference<Integer> cache = level2.computeIfAbsent(mod, val -> new WeakReference<>(tmp)); Integer val = cache.get(); if (val == null) { val = integer; level2.put(mod, new WeakReference<>(val)); } return val; } } public static int integersInCache() { synchronized (CACHE) { int sum = CACHE.size(); for (Integer key : CACHE.keySet()) { WeakHashMap<Integer, WeakHashMap<Integer,WeakReference<Integer>>> tmp = CACHE.get(key); sum += tmp.size(); for(Integer l2Key : tmp.keySet()) { sum += tmp.get(l2Key).size(); } } return sum; } } }
    展开
    共 1 条评论
    10
  • Eden Ma
    2020-03-09
    突然理解OC中NSString等也用到了享元设计模式.
    共 2 条评论
    9