JVM 字节码对类类交互的限制

2022-09-03 15:56:06

我正在查看JVM字节码指令,并惊讶地发现类之间的所有交互(例如,转换等)都依赖于恒定的池查找来查找其他类的标识。new

我推断这意味着一个类不能知道超过64k个其他类的存在,因为不可能引用它们,这是正确的吗?如果确实需要引用那么多,那么应该做什么 - 将工作委托给多个类,每个类都可以有自己的<64k交互?

(我对此感兴趣的原因是,我有编写代码生成器的习惯,有时会生成数千个不同的类,并且某些语言(例如Scala)会大量创建类。因此,如果这是真的,我必须小心:如果我在一个类中有数百个方法,每个方法都使用数百个(不同的)类,我可能会超过恒定的池空间。


答案 1

我推断这意味着一个类不能知道超过64k个其他类的存在,因为不可能引用它们,这是正确的吗?

我认为你是对的。不要忘记,其他事情都有恒定的池条目;例如,所有类的方法和字段名称,以及它的所有文本字符串。

如果确实需要引用那么多,那么应该做什么 - 将工作委托给多个类,每个类都可以有自己的<64k交互?

我想是的。

但是,我不相信这种担忧会在实践中实现。很难想象一个类需要直接与许多其他类进行交互......除非代码生成器忽略其输入源代码的结构。


答案 2

听起来您的问题可以通过 解决。这基本上是一种更快的反射形式,旨在简化动态语言在JVM上的实现。invokedynamic

如果您确实必须处理数千个自动生成的类,则可能不希望静态链接所有这些类。只需使用.这还具有允许您将某些代码生成推迟到运行时的优点。invokedynamic

请注意,对于类调用的每个动态方法,您仍然需要一个常量池条目,但不再需要引用实际类和被调用的方法。实际上,您可以按需创建它们。


推荐