面试题答案
一键面试WeakHashMap工作原理
- 基本结构:WeakHashMap是Java中一种特殊的Map实现,它使用弱引用(WeakReference)来存储键。其内部结构类似于HashMap,由数组和链表(或红黑树,Java 8及之后)组成。
- 存储方式:当向WeakHashMap中put一个键值对时,键会被包装成WeakReference对象。例如,若键为
key
,实际存储的是new WeakReference<>(key)
。 - 垃圾回收关联:垃圾回收器在扫描堆内存时,若发现某个键对象只被WeakHashMap中的WeakReference引用,而没有其他强引用指向它,那么该键对象就会被标记为可回收。一旦垃圾回收器执行回收操作,这个键的WeakReference就会被置为
null
。
内存管理优势
- 自动释放无用键值对:对于那些生命周期与程序其他部分关联不大、仅在WeakHashMap使用场景中有意义的键值对,当键不再被其他地方强引用时,WeakHashMap能自动释放这些键值对所占用的内存。这有助于防止内存泄漏,特别是在处理大量临时数据或缓存数据时。例如,在缓存场景中,如果缓存对象不再被其他地方使用,WeakHashMap会自动清理这些缓存项,避免内存浪费。
- 适用于资源敏感场景:在内存资源有限的环境(如移动设备、嵌入式系统)或对内存使用要求严格的应用(如大型数据处理系统)中,WeakHashMap能更好地管理内存,提高系统的稳定性和性能。
键变为弱可达时内存回收具体过程
- 弱可达判定:当键对象除了WeakHashMap中的WeakReference外,没有其他强引用指向它时,该键对象变为弱可达状态。
- 垃圾回收扫描:垃圾回收器在进行垃圾回收时,会扫描堆内存,识别出这些弱可达的键对象。
- WeakReference失效:垃圾回收器回收这些弱可达的键对象后,WeakHashMap中对应的WeakReference会被置为
null
。 - WeakHashMap清理:在WeakHashMap后续的操作(如
get
、put
、remove
或size
等)中,会检查并清理那些键引用为null
的Entry。当发现某个Entry的键引用为null
时,会将其从WeakHashMap的内部数据结构(数组和链表或红黑树)中移除,从而释放对应的内存空间。