PermGen空间中的Java类大小

PermGen空间中的Java类大小,java,memory,code-generation,permgen,Java,Memory,Code Generation,Permgen,有很多关于Java对象大小的问答,这很容易理解。但是我想知道PermGen空间中Java类的大小 我之所以想知道这一点,是因为我正在编写一个代码生成器,生成许多类。本质上,我为数据库中的每个表/视图生成两个类。现在我还想建模外键关系。与其维护一个复杂的、可序列化的对象结构(设想一个表有一个唯一的键被属于其他表的几个外键引用,还有其他外键等等),我更愿意为每个唯一键生成一个类,为每个外键生成一个类 以下是我的问题: 我将用它在类加载器和PermGen空间上创建多少开销 公共类、静态类和私有成员类之

有很多关于Java对象大小的问答,这很容易理解。但是我想知道PermGen空间中Java类的大小

我之所以想知道这一点,是因为我正在编写一个代码生成器,生成许多类。本质上,我为数据库中的每个表/视图生成两个类。现在我还想建模外键关系。与其维护一个复杂的、可序列化的对象结构(设想一个表有一个唯一的键被属于其他表的几个外键引用,还有其他外键等等),我更愿意为每个
唯一键生成一个类,为每个
外键生成一个类

以下是我的问题:

  • 我将用它在类加载器和PermGen空间上创建多少开销
  • 公共
    类、
    静态
    类和
    私有
    成员类之间是否存在差异
  • 您认为有更好的方法在源代码中生成外键信息吗

  • 我找到了一个不同的解决方案,它不像为每个
    键生成一个类那样浪费内存。我生成一个类,大致如下所示:

    public class References {
    
        // First, initialise all unique keys
        public static final UniqueKey<TAuthorRecord> SysPk_14655 = 
            createUniqueKey(TAuthor.T_AUTHOR, TAuthor.ID);
    
    
        // Then initialise all foreign keys
        public static final Reference<TBookRecord, TAuthorRecord> SysFk_14666 = 
            createReference(SysPk_14655, TBook.T_BOOK, TBook.AUTHOR_ID);
        public static final Reference<TBookRecord, TAuthorRecord> SysFk_14667 = 
            createReference(SysPk_14655, TBook.T_BOOK, TBook.CO_AUTHOR_ID);
    
    
        // Factory method for unique keys
        protected static <R extends Record> UniqueKey<R> 
        createUniqueKey(Table<R> table, TableField<R, ?>... fields) {
    
        // Factory method for foreign keys referencing unique keys
        protected static <R extends Record, U extends Record> Reference<R, U> 
        createReference(UniqueKey<U> key, Table<R> table, TableField<R, ?>... fields) {
    
    }
    
    公共类引用{
    //首先,初始化所有唯一键
    公共静态最终唯一密钥SysPk_14655=
    createUniqueKey(TAuthor.T_作者,TAuthor.ID);
    //然后初始化所有外键
    公共静态最终参考SysFk_14666=
    createReference(SysPk_14655,TBook.T_BOOK,TBook.AUTHOR_ID);
    公共静态最终参考系统FK_14667=
    createReference(SysPk_14655,TBook.T_BOOK,TBook.CO_AUTHOR_ID);
    //唯一密钥的工厂方法
    受保护的静态唯一密钥
    createUniqueKey(表、表字段…字段){
    //外键引用唯一键的工厂方法
    受保护静态参考
    createReference(UniqueKey键、表格、表格字段…字段){
    }
    
    生成的表类中的实际表可以引用并使用上述键。我查看了BobG在其一条评论中建议的JPA注释。但我发现它们在描述以下内容时没有多大用处:

    • 多字段键(
      @IdClass
      需要一个类型作为参数,我希望避免使用该类型)
    • 多字段引用(如何操作?)
    • 使用不同键从一个表到另一个表的多个引用
    • 唯一键,与主键共享许多属性

    一些评论提到了为什么我应该创建这样一个生成器,因为有很多已建立的框架。我这样做是为了。我觉得jOOQ正在填补当今数据库抽象可能性的一个空白。

    听起来像是一个在perm空间填满时避免内存错误的方法。谢谢duffymo。这就是为什么我问这个问题。我很好奇关于具体的数字,虽然没有,因为我对您生成的内容一无所知。我很好奇-既然您已经有这么多的持久性解决方案(直接JDBC、Hibernate、iBatis、TopLink、JPA等),为什么您认为这是必要的?你的解决方案为你带来了什么,而这些解决方案却没有?Re:3.你认为有更好的方法在源代码中生成外键信息吗?Hibernate通过注释或特定FK/PK列上的XML配置数据来实现这一点。但我是duffymo的,你所做的听起来与已经建立的ORM解决方案非常相似,除非你正在尝试从原始数据库模式自动生成域对象。@duffymo:我正在开发。我认为目前还没有类似的解决方案。你提到的所有解决方案都有其他解决方案没有的地方。有关详细信息,请参阅手册。我承认在我的日常工作(Spring/Hibernate项目)中有这样的内容我每周都会评估Hibernate是否真的节省了我的时间(我当然更喜欢SQL而不是Hibernate)我通常会得出结论,Hibernate为我节省了20%的时间,否则我会花在DAO层上。但是,对于复杂的查询,比如报告,我会恢复到直接SQL并绕过大部分Hibernate。@BobG,那么你应该给jOOQ一个机会。这将在DAO层上节省大约相同的时间,甚至更多时间更多,您也可以将其用于复杂查询。。。