一.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 } } }