类级交互的JVM字节码限制

时间:2013-05-04 15:37:52

标签: java jvm bytecode

我正在浏览JVM bytecode instructions并惊讶地看到类之间的所有交互(例如,转换,new等)依赖于对其他类的标识的常量池查找。 / p>

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

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

2 个答案:

答案 0 :(得分:5)

  

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

我认为你是对的。并且不要忘记其他东西有不断的池条目;例如所有类方法和字段名称及其所有文字字符串。

  

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

我想是的。

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

答案 1 :(得分:1)

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

如果您确实需要处理数千个自动生成的类,您可能不希望将其全部静态链接。只需使用invokedynamic即可。这也有一个优点,就是可以将一些代码生成推迟到运行时。

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