Java 方法声明中的最大参数数

2022-08-31 07:57:39

Java中的方法可以具有的最大参数数是多少,为什么?

我在64位Windows系统上使用Java 1.8。

StackOverflow上关于这个问题的所有答案都说技术限制是255个参数,而没有指定原因。

确切地说,255 用于静态方法,254 表示非静态(在本例中为第 255 个)方法。this

我认为这可以用某种规范来描述,并且只是静态定义允许的最大参数数。

但这只对 int 和所有 4 字节类型有效。我用参数做了一些测试,在这种情况下,我只能声明127个参数。long

使用参数,我从测试中推断出的允许数是255(这可能是因为Java中的引用大小为4个字节?String

但是由于我使用的是64位系统,因此引用大小应为8字节宽,因此使用参数时,允许的最大数量应为127,类似于类型。Stringlong

此限制是如何精确应用的?

该限制是否与方法的堆栈大小有关?

注意:我不打算在任何方法中使用这些参数,但这个问题只是为了澄清确切的行为。


答案 1

该限制在 JVM 规范中定义:

根据方法描述符的定义 (§4.3.3),方法参数的数量限制 255 个,其中在实例或接口方法调用的情况下,限制包括一个单位。

§4.3.3 节提供了一些附加信息:

方法描述符仅当它表示总长度为 255 或更小的方法参数时才有效,其中该长度包括在实例或接口方法调用的情况下对此的贡献。

总长度是通过对各个参数的贡献求和来计算的,其中长或双精度类型的参数对长度贡献两个单位,任何其他类型的参数贡献一个单位

您的观察结果是正确的,双字基元(/)需要两倍于通常的4字节变量和4字节对象实例引用的大小。longdouble

关于与64位系统相关的问题的最后一部分,规范定义了参数贡献的单位数,即使在64位平台上,规范的一部分仍然必须符合,64位JVM将容纳255个实例参数(如您的255),而不管内部对象的指针大小如何。Strings


答案 2

JVM 规范的 4.3.3 节包含您要查找的信息:

方法描述符仅当它表示总长度为 255 或更小的方法参数时才有效,其中该长度包括在实例或接口方法调用的情况下对此的贡献。总长度是通过对各个参数的贡献求和来计算的,其中长或双精度类型的参数对长度贡献两个单位任何其他类型的参数贡献一个单位

因此,主机是 32 位还是 64 位似乎对参数数量没有影响。如果您注意到,文档以“单位”来表示,其中一个“单位”的长度是字大小的函数。如果参数数量与字大小成正比,则会出现可移植性问题;您将无法在不同的体系结构上编译相同的Java程序(假设至少有一种方法在具有较大字大小的体系结构上使用最大数量的参数)。


推荐