Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇语;太多的常数”;JVM错误_Java_Jvm - Fatal编程技术网

Java 爪哇语;太多的常数”;JVM错误

Java 爪哇语;太多的常数”;JVM错误,java,jvm,Java,Jvm,我正在开发一个在运行时生成和编译类的应用程序。这有时会产生大量生成的代码 在我们的一个测试用例中,我从JVM中得到一个错误: TestClass.java:83865: too many constants 就这个。我见过其他关于类似错误的报告,但在这些情况下,错误消息会抱怨常量池。但在这种情况下,情况并非如此 如果这意味着达到了JVM常量池的限制,这意味着什么?我的意思是,在Java代码中这些常量是什么?类方法?领域?文字?我没有静态或最终的方法或字段 你能给我一些线索吗 编辑: 将代码拆分

我正在开发一个在运行时生成和编译类的应用程序。这有时会产生大量生成的代码

在我们的一个测试用例中,我从JVM中得到一个错误:

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插槽。实际上,数组中的每个唯一项都会对其计数。数组中的相同项可以使用常量池中的相同索引。