获得徽章 0
HashMap会造成内存泄露吗?什么情况?有什么解决办法呢?
1. 会的,当在一些缓存场景下,在缓存中通常会将对象作为键存储,当该对象不在被使用时,但是由于强引用的存在(map.put(对象,值)),其对应的键却无法从缓存中移除,从而导致内存泄露。
HashMap map = new HashMap();
Person person = new Person("张三",23);
map.put(person, 'haha');
如果此时对象不在被使用:person = null;
但是JVM还是不会被回收,因为它还被HashMap的键给强引用着,所以persson这个对象不会被回收。
2. 解决:
可以使用WeakHashMap,其使用的是弱引用,可以允许JVM在合适的时机回收这些键所对应的对象。
实际中使用WeakHashMap需要注意什么???![[谢谢]](//lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_112.2dd347d.png)
1. 会的,当在一些缓存场景下,在缓存中通常会将对象作为键存储,当该对象不在被使用时,但是由于强引用的存在(map.put(对象,值)),其对应的键却无法从缓存中移除,从而导致内存泄露。
HashMap map = new HashMap();
Person person = new Person("张三",23);
map.put(person, 'haha');
如果此时对象不在被使用:person = null;
但是JVM还是不会被回收,因为它还被HashMap的键给强引用着,所以persson这个对象不会被回收。
2. 解决:
可以使用WeakHashMap,其使用的是弱引用,可以允许JVM在合适的时机回收这些键所对应的对象。
实际中使用WeakHashMap需要注意什么???
![[谢谢]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_112.2dd347d.png)
展开
评论
7
ConcurrentHashMap为什么键和值不允许为空?
我认为:
由于ConcurrentHashMap是支持并发的,由于键值为null,就无法表示某个键对应的实际值到底是null,还是该键不存在,所以Java中提供了一个特殊对象"null表示空值,当有两个线程同时操作该集合时,会导致数据的不一致性。如果官方想解决这种问题可能会增加程序的复杂性吧。
欢迎有见解的大佬留下足迹
我认为:
由于ConcurrentHashMap是支持并发的,由于键值为null,就无法表示某个键对应的实际值到底是null,还是该键不存在,所以Java中提供了一个特殊对象"null表示空值,当有两个线程同时操作该集合时,会导致数据的不一致性。如果官方想解决这种问题可能会增加程序的复杂性吧。
欢迎有见解的大佬留下足迹
展开
8
2
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇沸点
![[发呆]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_4.28b310a.png)