面试题答案
一键面试WeakHashMap设计初衷
WeakHashMap的设计初衷是为了实现一种键为弱引用的映射。当一个键对象不再被其他强引用所指向时,该键值对会被垃圾回收机制回收,从而避免内存占用,适用于缓存等场景,当缓存对象在系统其他地方不再被使用时,能自动释放空间。
内存泄漏原因
- 错误的使用方式:若在WeakHashMap外部持有了WeakHashMap中键的强引用,即使键所指向的对象在其他地方不再有意义,由于外部强引用的存在,键不会被垃圾回收,而WeakHashMap内部基于弱引用的机制无法正常清理该键值对,导致该键值对一直占用内存,进而造成内存泄漏。
- 清理时机问题:WeakHashMap并不会在键对象成为弱可达(即只有弱引用指向它)时立即清理键值对。它是在进行put、remove等操作或者在垃圾回收过程中检测到键对象不可达时才进行清理。如果长时间没有这些操作,即使键对象应该被回收,其对应的键值对也会一直留在WeakHashMap中,占用内存。
避免内存泄漏方法
- 确保没有外部强引用:在使用WeakHashMap时,要确保除了WeakHashMap自身的弱引用外,没有其他地方持有键的强引用。例如在缓存场景中,要避免缓存对象在其他模块被错误地长期引用。
- 主动清理:可以定期调用WeakHashMap的
removeEldestEntry
方法(如果重写了该方法用于判断是否移除最旧的元素),或者手动调用keySet
获取键集,遍历并移除已经不再需要的键值对,以确保WeakHashMap中的数据得到及时清理。
对系统性能和稳定性的长期影响
- 性能影响:内存泄漏会导致内存使用量不断增加,随着时间推移,系统可用内存减少,可能导致频繁的垃圾回收,甚至引发OutOfMemoryError。垃圾回收的频繁执行会占用大量CPU时间,降低系统处理其他任务的能力,从而严重影响系统性能。
- 稳定性影响:持续的内存泄漏最终可能导致系统因内存耗尽而崩溃,降低系统的稳定性。对于长时间运行的系统,如服务器应用,内存泄漏问题若不解决,随着运行时间增长,出现故障的概率会不断增大,影响业务的正常运行。