我正在创建一个客户端类,它将连接到不同类型的数据库。以下是我想要做的代码片段。
public class Client{
private static Map<ApplicationTypeEnum, Connection> connectionPool = new HashMap<>();
public void init() throws Exception {
try {
Connection con1 = getConnection(someparams...);
connectionPool.put("app-1",con1)
Connection con2 = getConnection(someparams...);
connectionPool.put("app-2",con2)
} catch (Exception pe) {
throw pe;
}
}
}
现在Connection
对象是init
的本地对象,因此当控件超出Connection
方法时,是否有可能对init
个对象进行垃圾回收。< / p>
答案 0 :(得分:3)
只要存在指向这些对象的任何引用,它们就不会被垃圾回收。在你的情况下,你有静态变量connectionPool
指向map,持有这些对象。如果从上面提到的地图中删除这些对象,或者在没有这些对象的情况下将另一个地图分配给connectionPool
,并且不会对这些对象进行任何其他引用,那么它们将被收集。
答案 1 :(得分:2)
如果存储在静态中,方法局部变量将被垃圾收集 存储
变量永远不会被垃圾收集
只有对象被垃圾收集
当一个对象未被另一个其他生物对象引用时,该对象难以被收集。该对象可以由静态或实例字段引用。这对GC来说并不重要
但作为附注,static
字段不符合GC的条件。
在您的实际代码中,您在Connection
方法中创建的init()
被connectionPool static map
引用。
因为Connection
被至少一个活物体引用,所以这些物品没有资格被收集。
答案 2 :(得分:1)
没有。因为您已将引用存储在static
connectionPool
中,所以它们仍然可以访问,并且不符合垃圾回收的条件。