Размер класса Java в пространстве PermGen - PullRequest
6 голосов
/ 02 мая 2011

Существует множество вопросов и ответов о размере Java-объекта, что довольно просто для понимания. Но меня интересует размер Java-класса в пространстве PermGen.

Причина, по которой меня это интересует, заключается в том, что я пишу генератор кода, генерирующий много классов. По сути, я генерирую два класса для каждой таблицы / представления в базе данных. Теперь я также хочу смоделировать отношения с внешними ключами. Вместо того, чтобы поддерживать сложную, сериализуемую объектную структуру (представьте себе таблицу с уникальным ключом, на который ссылаются несколько внешних ключей, принадлежащих другим таблицам с другими внешними ключами и т. Д.), Я бы предпочел генерировать один класс на UNIQUE KEY и один класс на FOREIGN KEY.

Вот мои вопросы:

  1. Сколько накладных расходов на загрузчик классов и пространство PermGen я буду создавать с этим?
  2. Есть ли разница между public классами, static классами и private классами-членами?
  3. Видите ли вы лучший способ для генерации информации внешнего ключа в исходном коде?

1 Ответ

2 голосов
/ 03 мая 2011

Я нашел другое решение, не тратя впустую столько памяти, сколько генерация одного класса на 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) {

}

Фактические таблицы из сгенерированных классов таблиц могут затем ссылаться и использовать вышеупомянутые ключи. Я посмотрел аннотации JPA, как предложено BobG в одном из его комментариев. Но я не нашел их очень полезными для описания:

  • Клавиши с несколькими полями (@IdClass нужен тип в качестве параметра, и я хочу избежать этого типа)
  • Многополевые ссылки (как это сделать?)
  • Несколько ссылок из одной таблицы в другую с использованием разных ключей
  • Уникальные ключи, которые совместно используют многие свойства с первичным ключом.

В некоторых комментариях упоминалось, почему я должен создать такой генератор, потому что существует множество установленных фреймворков. Я делаю это для http://www.jooq.org. И я чувствую, что jOOQ восполняет пробел в сегодняшних возможностях абстрагирования базы данных.

...