1

我继承了一个非常奇怪的设计,以前的联系公司用来在 Java 中实现 DAO。我相信这是我不断收到 PermGen 错误的原因,但想看看其他人的想法。

每个 DAO 都有一个或多个私有静态最终字段。这些是表类型。表是一个抽象类。每个 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());
    }
}
4

1 回答 1

1

如果每个具有某种类类型的静态最终字段的类都阻止 ClassLoader 被垃圾收集,那么我们在任何程序中都不会走得太远,所以除非你能提供更多信息(例如“DAO 是从类加载器 A ,但是 Table 实现来自类加载器 B”,但是那会起作用),我将选择“不,这不可能是原因。”

于 2013-08-26T16:29:09.597 回答