2017-06-03 97 views
3

我正在創建一個客戶端類,它將連接到不同類型的數據庫。以下是我正在嘗試執行的代碼段。方法局部變量是否會將垃圾收集後存儲在靜態存儲中?

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方法。

回答

2

只要存在指向這些對象的引用,它們就不會被垃圾收集。在你的情況下,你有指向地圖的靜態變量connectionPool,持有這些對象。如果您從上述地圖中刪除這些對象,或將其他地圖指定給connectionPool而沒有這些對象,並且不會有任何其他對這些對象的引用,那麼將會收集這些對象。

1

不可以。因爲您已將引用存儲在staticconnectionPool中,它們仍然可以訪問,並且不符合垃圾回收的條件。

2

是方法局部變量將垃圾收集,如果存儲在靜態 存儲?

可變從不垃圾收集。
只有對象被垃圾收集。
當一個物體沒有被另一個其他活物所引用時,該物體難以被收集。
該對象可能被靜態或實例字段引用。對於GC來說並不重要。
但作爲附註,static字段不符合GC的條件。

在您的實際代碼中,您在init()方法中創建的ConnectionconnectionPool static map引用。
因此,當Connection被至少一個活體所引用時,這些不符合收集條件。