面试题答案
一键面试WeakHashMap内存泄漏风险分析
-
WeakHashMap工作原理
- WeakHashMap使用弱引用(WeakReference)来关联键对象。当一个键对象在系统的其他地方不再有强引用指向它时,在下一次垃圾回收运行时,这个键对象就可能被回收。
- 比如:
WeakHashMap<String, Integer> weakMap = new WeakHashMap<>(); String key = new String("testKey"); weakMap.put(key, 1); key = null; // 此时key不再有强引用指向原来的"testKey"字符串对象 // 当垃圾回收运行时,"testKey"对象可能被回收
-
普通HashMap工作原理
- 普通HashMap使用强引用关联键值对。只要HashMap对象本身存在,并且键值对还在HashMap的生命周期内,键和值对象都不会被垃圾回收,即使在系统其他地方不再使用这些键值对的引用。
- 例如:
HashMap<String, Integer> hashMap = new HashMap<>(); String key = new String("testKey"); hashMap.put(key, 1); key = null; // 虽然这里key不再指向"testKey",但由于hashMap对"testKey"是强引用,"testKey"不会被垃圾回收
-
WeakHashMap内存泄漏风险
- 风险场景:如果在WeakHashMap中放入一个键值对,之后键对象在系统其他地方没有强引用了,但如果该WeakHashMap对象一直存在(比如是一个静态成员变量),且垃圾回收没有及时运行,那么这个键对象占用的内存就不会被释放,直到垃圾回收运行将其回收,这期间就存在内存泄漏的风险。
- 对比普通HashMap:普通HashMap不存在这种因键对象可能被垃圾回收而导致的潜在内存暂留问题,因为普通HashMap通过强引用保证了键值对在其自身生命周期内不会被垃圾回收,只有当HashMap对象本身不再被引用时,其中的键值对才会被垃圾回收。
总结来说,WeakHashMap由于使用弱引用关联键对象,在垃圾回收时机不确定以及WeakHashMap对象长期存在的情况下,可能导致原本可回收的键对象内存暂留,从而产生内存泄漏风险。