【发布时间】:2016-07-10 14:29:29
【问题描述】:
几周前,我编写了一个具有以下行为的 Java 类:
- 每个对象都包含一个最终整数字段
- 该类包含一个静态 Map(键:整数,内容:MyClass)
- 每当实例化类的对象时,如果静态映射中已经存在具有所需整数字段的对象,则进行查找:返回它,否则创建一个并将其放入映射中。
作为代码:
public class MyClass
{
private static Map<Integer, MyClass> map;
private final int field;
static
{
map = new HashMap<>();
}
private MyClass(int field)
{
this.field = field;
}
public static MyClass get(int field)
{
synchronized (map)
{
return map.computeIfAbsent(field, MyClass::new);
}
}
}
这样我可以确定,每个整数(作为字段)只存在一个对象。我目前担心,这将阻止 GC 收集我不再需要的对象,因为对象始终存储在地图中(存在引用)...
如果我写了一个像这样的循环函数:
public void myFunction() {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
MyClass c = MyClass.get(i);
// DO STUFF
}
}
调用该方法后,我最终会在内存中得到Integer.MAX_VALUE 对象。有没有办法可以检查对地图中对象的引用是否存在,否则将其删除?
【问题讨论】:
-
通常这种技术用于拥有某种缓存以避免在对象已经创建时创建它们。这不是你的目标吗?因为在这种情况下,它们一直分配到程序结束是有意义的。
-
您可能想要使用软引用或弱引用。例如。请参阅What is the difference between a soft reference and a weak reference in Java? 或者,使用 3rd-party 缓存库,例如见Looking for simple Java in-memory cache。
-
@LorisSecuro 是的,这就是我的目标。但我更愿意缓存可能最多说 1000 个对象,然后只缓存当前需要/引用的对象。
-
@Andreas 谢谢,我去看看:)
-
@John 也许你应该试试番石榴缓存
标签: java dictionary reference garbage-collection