如果存储在静态存储中,方法局部变量是否会被垃圾收集?
Is Method local variable will garbage collected if stored in static storage?
我正在创建一个客户端 class,它将连接到不同类型的数据库。以下是我正在尝试执行的代码片段。
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
的本地对象,所以当控制脱离 init
方法时,Connection
对象是否有可能被垃圾回收.
没有。因为您已将引用存储在 static
connectionPool
中,它们仍然可以访问,并且不符合垃圾回收条件。
只要存在任何指向这些对象的引用,它们就不会被垃圾回收。在您的情况下,您有静态变量 connectionPool
指向地图,保存这些对象。如果您从上述地图中删除这些对象或将另一个地图分配给没有这些对象的 connectionPool
,并且不会有任何其他对这些对象的引用,那么它们将被收集。
Is Method local variable will garbage collected if stored in static
storage?
变量永远不会被垃圾回收。
只有对象被垃圾收集。
当一个对象未被另一个其他活动对象引用时,该对象将无法被收集。
该对象可能被静态或实例字段引用。 GC没关系。
但作为旁注,static
字段不符合 GC 的条件。
在您的实际代码中,您在 init()
方法中创建的 Connection
被 connectionPool static map
.
引用
因此,由于 Connection
至少被一个活体对象引用,因此不符合收集条件。
我正在创建一个客户端 class,它将连接到不同类型的数据库。以下是我正在尝试执行的代码片段。
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
的本地对象,所以当控制脱离 init
方法时,Connection
对象是否有可能被垃圾回收.
没有。因为您已将引用存储在 static
connectionPool
中,它们仍然可以访问,并且不符合垃圾回收条件。
只要存在任何指向这些对象的引用,它们就不会被垃圾回收。在您的情况下,您有静态变量 connectionPool
指向地图,保存这些对象。如果您从上述地图中删除这些对象或将另一个地图分配给没有这些对象的 connectionPool
,并且不会有任何其他对这些对象的引用,那么它们将被收集。
Is Method local variable will garbage collected if stored in static storage?
变量永远不会被垃圾回收。
只有对象被垃圾收集。
当一个对象未被另一个其他活动对象引用时,该对象将无法被收集。
该对象可能被静态或实例字段引用。 GC没关系。
但作为旁注,static
字段不符合 GC 的条件。
在您的实际代码中,您在 init()
方法中创建的 Connection
被 connectionPool static map
.
引用
因此,由于 Connection
至少被一个活体对象引用,因此不符合收集条件。