Java 爪哇语;太多的常数”;JVM错误
我正在开发一个在运行时生成和编译类的应用程序。这有时会产生大量生成的代码 在我们的一个测试用例中,我从JVM中得到一个错误:Java 爪哇语;太多的常数”;JVM错误,java,jvm,Java,Jvm,我正在开发一个在运行时生成和编译类的应用程序。这有时会产生大量生成的代码 在我们的一个测试用例中,我从JVM中得到一个错误: TestClass.java:83865: too many constants 就这个。我见过其他关于类似错误的报告,但在这些情况下,错误消息会抱怨常量池。但在这种情况下,情况并非如此 如果这意味着达到了JVM常量池的限制,这意味着什么?我的意思是,在Java代码中这些常量是什么?类方法?领域?文字?我没有静态或最终的方法或字段 你能给我一些线索吗 编辑: 将代码拆分
TestClass.java:83865: too many constants
就这个。我见过其他关于类似错误的报告,但在这些情况下,错误消息会抱怨常量池。但在这种情况下,情况并非如此
如果这意味着达到了JVM常量池的限制,这意味着什么?我的意思是,在Java代码中这些常量是什么?类方法?领域?文字?我没有静态或最终的方法或字段
你能给我一些线索吗
编辑:
将代码拆分为多个类已在计划中。虽然不是因为这个原因
我意识到了恒定池的局限性,我的怀疑是到底进入了什么。生成的代码没有超过10000个方法+字段
我的疑问是,文本是否也会进入常量池,因为这是我看到将这个数字提高到65K的唯一原因。似乎是这样。
常量池包括数字、字符串、方法名、字段名、类名、对类和方法的引用……基本上包括所有内容
它们最多可以有65536个。准确定义了构成常量池的内容(主要是对类/方法和文本的引用)。来自:
您可以看到classfile.constant_pool_count
有一个“u2”类型,它将其限制为65535个条目
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
我不知道这是否非常相关,但对于数组常量,每个字段都对其计数。 我不太清楚为什么(我的猜测是,您实际上没有给出一个文本,因此运行时必须手动输入每个值,因此需要它们都是常量),但事实就是这样 我在生成一个大缓存作为数组文本时发现了这个问题。 因为我不想手工写出1000000个常数,所以我写了一个小程序来为我写这个程序。我想看看启动时缓存所有内容时程序的速度有多快 (问题是Skiela和Revilla的“编程挑战”中的1.6.1,ISBN 0-387-00163-8)
因此,您可能在某个地方有一些包含文字的数组。这不算作一个常数。它被计为array.length常量。或者array.length+1常量。这是什么类型的代码?您可能会发现此链接非常有用,可以阅读,可能意味着已经达到了某些限制。我忘了常量池的限制是什么,但编译器内部也有其他限制。也许一个文件中的代码有83K+行这一事实应该提示您将其拆分为多个类。方法名和其他
String
s可通过反射访问,进入常量池。这意味着它与我在主类中声明的字段数量无关。即使这些字段在其他类中声明,只要我从同一个主类引用它们,我也会遇到同样的问题,对吗?任何一个类引用的不同字段、方法等的数量都限制在65536个,是的,我相信是这样。Louis是正确的-所有引用和定义、常量等的总数。。仅限于该数量。因此,您甚至不能使用数组和常量来进行索引,因为索引也会占用CP插槽。实际上,数组中的每个唯一项都会对其计数。数组中的相同项可以使用常量池中的相同索引。