我继承了一个非常奇怪的设计,以前的联系公司用来在Java中实现DAO。我相信这是我不断得到PermGen错误的原因,但我想看看其他人的想法。
每个DAO都有一个或多个私有静态最终字段。这些是Table类型。表是一个抽象类。每个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 :(得分:1)
如果每个具有某些类类型的静态final字段的类阻止了ClassLoader被垃圾收集,我们就不会在任何程序中走得太远,所以除非你能提供更多信息(例如“DAO是从类加载器A,但是Table实现来自类加载器B“,但是这样可以工作),我将选择”不,这不可能是原因。“