Jooq/Java常量池64K限制

use*_*708 4 java class jooq

引用Jooq手册:

对于非常大的模式,关闭上述文件的生成可能是必要的,模式超出了类的常量池中允许的常量(64k),或者其静态初始化将超过64k的字节代码

我确实理解这个问题,但是如何衡量或计划这个问题.有没有人对每个表的合理平均名称长度有多少列有多少表?我真的很欣赏这样一个事实,即它是一个"多长时间是一段字符串"的问题 - 但任何合理准确度或经验丰富的估计的公式都会受到赞赏.

Raf*_*ter 7

JOOQ代码生成器在代码库中为每个表/序列/键添加一个字段.代码生成器已经确保代码仅设置此字段,但不创建任何复杂语句,这会减小代码大小.由于该字段是静态的,这进一步减少了所需的字节代码.每个初始化指令是一对字段读取和字段写入.在字节代码中,每个这样的指令是:

GETSTATIC (reference)
PUTSTATIC (reference)
Run Code Online (Sandbox Code Playgroud)

字节代码是单字节,其中每个字段引用是两个字节的索引,使每个指令计数6个字节.由于静态初始化程序需要以(隐式)return语句结束,因此会向该方法添加另一个字节.每个方法有64kB-1B可用字节,每个字段有6个字节,这告诉我们初始化程序在超过限制之前每个类最多可以容纳10.922个这样的字段,即支持大多数(65536 - 1) / 6 = 10.922表,序列或键.

常量池最多可以包含65536个词条.限制的计算有点困难,因为常量池不包含重复值但重用现有条目.我们对最坏情况进行计算,其中没有名称被使用多次.

每个字段引用都是类引用和名称和类型引用的组合.类引用包含对具有类型名称的字符串的另一个引用.name-and-type引用包含对字段名称的两个引用,以及作为字符串的字段描述符.set指令的所有者类型总是重复的,我们假设get指令在最坏的情况下从不重复,每个指令对占2个条目.对于每个指令对,set和get字段的类型和名称总是相等的,每个指令对有两个条目.包装名称和类型条目对于双方始终是唯一的,每个指令对占两个条目.这为2 + 1 + 1 + 2 = 6每个指令对留下了条目.set指令的所有者类型将始终位于常量池中,因为它是定义类所必需的.此外,我们需要考虑基本信息,如定义的类名称和默认构造函数.幸运的是,注释具有源保留,因此它们被排除在类文件之外.一般的内务管理需要12个条目,这些条目给我们留下了(65536 - 12) / 6 = 10.920表格,序列或密钥.

我们需要尊重这两个限制,因此10.920表,序列或键是您受约束的数字.

请注意,由于为内部类属性定义了常量池条目,实际数字可能会更低.这会为每个内部类生成额外的内部类引用,从而减少了空闲条目的数量.如果你保持低于10.000元素,我想你不会遇到任何麻烦.