1. ホーム
  2. java

[解決済み] Javaメソッド宣言におけるパラメータの最大数

2022-06-09 01:01:37

質問

Javaでメソッドが持つことのできるパラメータの最大数はいくつでしょうか?

64ビットのWindowsシステムでJava 1.8を使用しています。

これに関する StackOverflow のすべての回答は、技術的な制限は 255 のパラメータであり、その理由は明記されていないと述べています。

正確には、静的なものは255、非静的なものは254です ( this が255番目となります)メソッドです。

これは何らかの仕様で記述できるもので、単純に許容されるパラメータの最大数が静的に定義されているのだと思いました。

しかし、これが有効だったのは int という4バイトの型と、すべての4バイトの型 . 私は、いくつかのテストを long パラメータでいくつかのテストを行いましたが、その場合127個のパラメータしか宣言できませんでした。

とは String パラメータを使用した場合、私がテストから推測した許容数は255です(Javaでは参照サイズが4バイトだからでしょうか)。

しかし、私は64ビットシステムを使用しているので、参照サイズは8バイト幅であるべきであり、そのため String パラメータで指定できる最大数は 127 で、これは long の型と同様です。

この制限は具体的にどのように適用されるのですか?

この制限は スタックサイズ と関係があるのでしょうか?

注:私は実際にはどのメソッドでもこれらの多くのパラメータを使用するつもりはありませんが、この質問は正確な動作を明確にするためだけのものです。

どのように解決するのですか?

その制限は JVM仕様 :

メソッドパラメータの数 は255個に制限されています。 メソッド記述子の定義 (§4.3.3) によって制限されます。 この を1単位とする。

セクション §4.3.3 には、いくつかの追加情報があります。

メソッド記述子は、全長255以下のメソッドパラメータを表す場合にのみ有効であり、その長さには この の寄与も含まれます。

全体の長さは、個々のパラメータの寄与を合計することで計算されます。 ここでlongまたはdouble型のパラメータは長さに2単位を、それ以外の型のパラメータは1単位を寄与します。 .

あなたの観察は的確でした、ダブルワードプリミティブ( long / double ) は、通常の4バイト変数の2倍のサイズが必要です。 と4バイトのオブジェクトインスタンス参照 .

ご質問の最後の64bitシステムに関する部分ですが、仕様書ではどのように多くの 単位で定義されています。 というのがあり、その部分は に従わなければなりません。 64ビットプラットフォームであっても、64ビットJVMは255のインスタンスパラメータ(あなたの255のような Strings のように)内部オブジェクトのポインターサイズに関係なく、255のインスタンスパラメーターに対応します。