闽公网安备 35020302035485号
一.LoadingCache 代替全局 Map
@Service
public class MetaInfoManager {
// 堆代码 duidaima.com
// 对于少量的元数据来说, 放到内存中似乎并无大碍, 但如果后续元数据量增大, 则大量对象则内存中无法释放, 导致内存泄漏
private Map<String, MetaInfo> cache = new HashMap<>();
public MetaInfo getMetaInfo(String id) {
return cache.computeIfAbsent(id, k -> loadFromRemote(id));
}
private LoadingCache<String, MetaInfo> loadingCache = CacheBuilder.newBuilder()
// loadingCache 设置最大 size 或者过期时间, 能够限制缓存条目的数量
.maximumSize(1000)
.build(new CacheLoader<String, MetaInfo>() {
@Override
public MetaInfo load(String key) throws Exception {
return loadFromRemote(key);
}
});
public MetaInfo getMetaInfoFromLoadingCache(String id) {
return loadingCache.getUnchecked(id);
}
private MetaInfo loadFromRemote(String id) {
return null;
}
@Data
public static class MetaInfo {
private String id;
private String name;
}
}
二.谨慎使用运行时类生成技术public class TryWithResourceExample {
public static void main(String[] args) throws IOException {
try (InputStream in = Files.newInputStream(Paths.get(""))) {
// read
}
}
}