Ограничение 64 КБ постоянного пула Jooq / Java

Цитата из руководства Jooq:

Отключение генерации вышеуказанных файлов может быть необходимо для очень больших схем, которые превышают количество разрешенных констант в пуле констант класса (64 КБ) или статический инициализатор которых превышает 64 КБ байтового кода.

Я понимаю суть проблемы, но как это сделать? Есть ли у кого-нибудь хорошая оценка того, сколько таблиц со сколькими столбцами в таблице с разумной средней длиной имени это? Я действительно ценю тот факт, что это вопрос типа «как долго это кусок веревки», но приветствуются любые формулы разумной точности или хорошо опытной оценки.


person user1210708    schedule 18.11.2016    source источник


Ответы (1)


Генератор кода JOOQ добавляет поле для каждой таблицы / последовательности / ключа в базе кода. Генератор кода уже гарантирует, что код только устанавливает это поле, но не создает никаких сложных операторов, что уменьшает размер кода. Поскольку поле является статическим, это дополнительно сокращает требуемый байтовый код. Каждая инструкция инициализации представляет собой пару из чтения поля и записи поля. В байтовом коде каждая такая инструкция выглядит так:

GETSTATIC (reference)
PUTSTATIC (reference)

Байт-код - это однобайтный код, где каждая ссылка на поле представляет собой двухбайтовый индекс, в результате чего каждая инструкция насчитывает 6 байтов. Поскольку статический инициализатор требует завершения (неявным) оператором return, это добавляет к методу еще один байт. Имея 64 КБ - 1 Байт на каждый метод и 6 байтов на поле, это говорит нам о том, что инициализатор может хранить не более 10.922 таких полей на класс до превышения лимита, то есть поддерживать не более (65536 - 1) / 6 = 10.922 таблиц, последовательностей или ключей.

постоянный пул может содержать не более 65536 записи. Расчет предела немного сложнее, поскольку пул констант не содержит повторяющихся значений, а повторно использует существующую запись. Мы делаем расчет для худшего случая, когда никакие имена не используются более одного раза.

Каждая ссылка на поле представляет собой соединение ссылки на класс и ссылки на имя и тип. Ссылка на класс содержит еще одну ссылку на строку с именем типа. Ссылка на имя и тип содержит две ссылки на имя поля и дескриптор поля в виде строки. Тип владельца инструкции set всегда дублируется, мы предполагаем, что в худшем случае инструкция get никогда не дублируется, учитывая 2 записи на пару инструкций. Типы и имена полей set и get всегда равны для каждой пары инструкций, что составляет две записи на пару инструкций. Запись обертывающего имени и типа всегда уникальна для обеих сторон, с учетом двух записей на пару инструкций. Это оставляет нам 2 + 1 + 1 + 2 = 6 записи на пару инструкций. Тип владельца инструкции set всегда будет в постоянном пуле, поскольку это требуется для определения класса. Кроме того, нам необходимо учитывать основную информацию, такую ​​как имя определенного класса и его конструктор по умолчанию. К счастью, в аннотациях сохраняется исходный код, поэтому они исключены из файла класса. Общее обслуживание требует 12 записей, что оставляет нам (65536 - 12) / 6 = 10.920 таблиц, последовательностей или ключей.

Нам необходимо соблюдать оба ограничения, поэтому 10,920 таблиц, последовательностей или ключей - это число, которым вы ограничены.

Имейте в виду, что фактическое число может быть ниже из-за того, что записи пула констант определены для атрибутов внутреннего класса. Это создает дополнительные ссылки на внутренние классы для каждого внутреннего класса, что уменьшает количество свободных записей. Думаю, у вас не возникнет никаких проблем, если вы останетесь ниже 10.000 элементов.

person Rafael Winterhalter    schedule 18.11.2016