MST
星途 面试题库

面试题:Java弱引用在缓存场景的应用

假设你正在开发一个缓存系统,需要使用弱引用来避免内存泄漏。请描述如何使用Java的弱引用构建这样一个简单的缓存机制,包括如何添加缓存对象、如何获取缓存对象以及垃圾回收时缓存对象的处理逻辑。
19.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 使用Java弱引用构建简单缓存机制

在Java中,WeakReference类可用于实现弱引用。以下是使用弱引用构建简单缓存机制的步骤:

添加缓存对象

  1. 创建缓存容器: 通常使用Map来存储缓存数据,键为缓存对象的标识,值为WeakReference指向实际的缓存对象。
    import java.lang.ref.WeakReference;
    import java.util.HashMap;
    import java.util.Map;
    
    public class WeakCache {
        private Map<String, WeakReference<Object>> cache = new HashMap<>();
    
        public void put(String key, Object value) {
            cache.put(key, new WeakReference<>(value));
        }
    }
    

获取缓存对象

  1. 从缓存中获取对象: 从Map中获取WeakReference,然后通过WeakReference.get()方法获取实际的缓存对象。需要注意的是,由于是弱引用,对象可能已经被垃圾回收,所以get()方法可能返回null
    public Object get(String key) {
        WeakReference<Object> weakReference = cache.get(key);
        return weakReference == null? null : weakReference.get();
    }
    

垃圾回收时缓存对象的处理逻辑

  1. 垃圾回收处理: 当没有强引用指向缓存对象时,垃圾回收器会在适当的时候回收该对象。此时,WeakReference指向的对象变为null。在下次获取缓存对象时,通过WeakReference.get()方法返回null,表示缓存对象已被回收。 例如,假设在某个地方有以下代码:
    WeakCache cache = new WeakCache();
    Object largeObject = new Object();
    cache.put("key1", largeObject);
    largeObject = null; // 移除对largeObject的强引用
    // 当垃圾回收器运行时,largeObject可能会被回收
    Object retrievedObject = cache.get("key1");
    if (retrievedObject == null) {
        System.out.println("缓存对象已被垃圾回收");
    }
    

通过上述步骤,就可以使用Java的弱引用构建一个简单的缓存机制,在一定程度上避免内存泄漏。