如果存储在静态存储中,方法局部变量是否会被垃圾收集?

时间:2017-06-03 16:54:27

标签: java garbage-collection connection

我正在创建一个客户端类,它将连接到不同类型的数据库。以下是我想要做的代码片段。

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>

3 个答案:

答案 0 :(得分:3)

只要存在指向这些对象的任何引用,它们就不会被垃圾回收。在你的情况下,你有静态变量connectionPool指向map,持有这些对象。如果从上面提到的地图中删除这些对象,或者在没有这些对象的情况下将另一个地图分配给connectionPool,并且不会对这些对象进行任何其他引用,那么它们将被收集。

答案 1 :(得分:2)

  

如果存储在静态中,方法局部变量将被垃圾收集   存储

变量永远不会被垃圾收集 只有对象被垃圾收集 当一个对象未​​被另一个其他生物对象引用时,该对象难以被收集。该对象可以由静态或实例字段引用。这对GC来说并不重要 但作为附注,static字段不符合GC的条件。

在您的实际代码中,您在Connection方法中创建的init()connectionPool static map引用。
因为Connection被至少一个活物体引用,所以这些物品没有资格被收集。

答案 2 :(得分:1)

没有。因为您已将引用存储在static connectionPool中,所以它们仍然可以访问,并且不符合垃圾回收的条件。