方法局部变量是否会将垃圾收集后存储在静态存储中?
问题描述:
我正在创建一个客户端类,它将连接到不同类型的数据库。以下是我正在尝试执行的代码段。方法局部变量是否会将垃圾收集后存储在静态存储中?
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
方法。
答
只要存在指向这些对象的引用,它们就不会被垃圾收集。在你的情况下,你有指向地图的静态变量connectionPool
,持有这些对象。如果您从上述地图中删除这些对象,或将其他地图指定给connectionPool
而没有这些对象,并且不会有任何其他对这些对象的引用,那么将会收集这些对象。
答
不可以。因为您已将引用存储在static
connectionPool
中,它们仍然可以访问,并且不符合垃圾回收的条件。
答
是方法局部变量将垃圾收集,如果存储在静态 存储?
可变从不垃圾收集。
只有对象被垃圾收集。
当一个物体没有被另一个其他活物所引用时,该物体难以被收集。
该对象可能被静态或实例字段引用。对于GC来说并不重要。
但作为附注,static
字段不符合GC的条件。
在您的实际代码中,您在init()
方法中创建的Connection
由connectionPool static map
引用。
因此,当Connection
被至少一个活体所引用时,这些不符合收集条件。