2013-08-20 59 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