2011-05-02 61 views
6

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

我想知道这个的原因是因为我在编写代码生成器,生成很多类。基本上,我为数据库中的每个表/视图生成两个类。现在我也想模拟外键关系。而不是维护一个复杂的,可串行化的对象结构(考虑一个具有由属于其他外键的其他表的多个外键引用的唯一键的表),我倾向于根据UNIQUE KEY和一个类生成一个类每FOREIGN KEY

这里是我的问题:

  1. 如何在类加载器和PermGen的空间的开销将我这个创造?
  2. public班,static班和private成员班之间是否有区别?
  3. 您是否看到在源代码中生成外键信息的更好方法?
+0

听起来像是在烫发空间填满时获取OutOfMemoryErrors的秘诀。 – duffymo 2011-05-02 18:26:59

+0

谢谢duffymo。这就是我问的原因。我很好奇具体的数字,虽然 – 2011-05-02 18:27:54

+0

没有,因为我不知道你产生什么。我很好奇 - 当你有很多持久化解决方案(直接JDBC,Hibernate,iBatis,TopLink,JPA等)时,为什么你认为这是必要的?你买的这些解决方案不是什么? – duffymo 2011-05-02 18:30:45

回答

1

我发现了一个不同的解决方案,没有浪费像生成一个类每个KEY一样多的内存。我生成单个类,大致看起来像这样:

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) { 

} 

从所生成的表格类的实际表然后可以参考和使用上述密钥。我按照BobG的建议查看了JPA注释。但我没有发现他们非常有用的描述:

  • 多场键(@IdClass需要一个类型作为参数,我想避免这种类型)
  • 多字段引用(怎么办呢?)
  • 从一个表到另一个表使用不同的键的多个引用
  • 唯一键与主键共享许多属性。

的一些评论中提到我为什么要建立这样一个发电机,因为有很多既定的框架。我正在为http://www.jooq.org做这个。我觉得jOOQ正在填补今天数据库抽象可能性的空白。

+0

我得承认,我的天作业(春/ Hibernate项目)我评价休眠每周至于是否真的救了我的任何时间或没有。 (我当然更舒服SQL比休眠。)我通常最终得出的结论是休眠节省了我的时间时间,我本来可以在DAO层上的支出约20%。但是,对于复杂的查询 - 诸如报表之类的东西 - 我会恢复为直接的SQL并绕过大部分Hibernate。 – BobG 2011-05-03 18:55:25

+0

@BobG,那么你应该给jOOQ了一枪。这将节省你周围的相同的时间DAO层甚至更多,*和*您可以使用它进行复杂查询太... – 2011-05-03 19:31:26