方法局部变量是否会将垃圾收集后存储在静态存储中?

问题描述:

我正在创建一个客户端类,它将连接到不同类型的数据库。以下是我正在尝试执行的代码段。方法局部变量是否会将垃圾收集后存储在静态存储中?

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而没有这些对象,并且不会有任何其他对这些对象的引用,那么将会收集这些对象。

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

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

可变从不垃圾收集。
只有对象被垃圾收集。
当一个物体没有被另一个其他活物所引用时,该物体难以被收集。
该对象可能被静态或实例字段引用。对于GC来说并不重要。
但作为附注,static字段不符合GC的条件。

在您的实际代码中,您在init()方法中创建的ConnectionconnectionPool static map引用。
因此,当Connection被至少一个活体所引用时,这些不符合收集条件。