2013-08-20 53 views
1

我繼承了一個非常奇怪的設計,以前的聯繫公司用於在Java中實現DAO。我相信這是我不斷得到PermGen錯誤的原因,但希望看到別人的想法。PermGen錯誤的奇怪的DAO設計原因?

每個DAO都有一個或多個私有靜態final字段。這些是Table類型。表是一個抽象類。每個表的實現都是在線實施的。在靜態塊中,這些實現被放入靜態哈希映射中。

是否有可能由於OBJ_MAP包含Table類的實現,這可能導致ClassLoader永遠無法被垃圾收集?

import java.sql.Types; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class MyDAO { 
    private static final Table DESCRIPTION = new TableImpl("MYDESC", Types.VARCHAR); 
    private static final Table CODE = new TableImpl("MYCODE", Types.VARCHAR); 

    private static final Map<Table, String> OBJ_MAP = new HashMap<Table, String>(); 

    static { 

     OBJ_MAP.put(DESCRIPTION, "description"); 
     OBJ_MAP.put(CODE, "code"); 
    } 

    @SuppressWarnings("unchecked") 
    public List<BusinessType> getAllBusinessTypes() { 
     return DAOUtil.executeObjectSelect("Select MYDESC, MYCODE, 
       from MYTABLE", BusinessType.class, 
      OBJ_MAP, new BusinessType()); 
    } 
} 
+0

OBJ_MAP保存Table的實例,而不是其定義(即Class對象)。如果你能提供更多的細節,這將會更有幫助。例如,你觀察到什麼異常行爲,以及觀察它時執行什麼代碼? – dacongy

+0

「每個表的實現都是在線實現的」。不在示例代碼中,它們不是。 –

+0

啊,你是對的。我認爲這是奇怪的語法。表是一個抽象類,所以我認爲這個類是內聯的。我忽略了最後沒有{},並且沒有看到TableImpl類。 – aglassman

回答

1

如果每一個有一些類類型的靜態final字段被當作垃圾收集防止ClassLoader類,我們不會在任何程序中得到很遠,所以除非你能提供更多的信息(例如,「在DAO是從類加載器A加載的,但是表的實現來自類加載器B「,但是這會起作用),我將按照」不,這不可能是原因「去做。

+0

是的,在查看代碼後,我不認爲這是導致PermGen錯誤的原因。目前試圖找到jhat的罪魁禍首。 – aglassman