Java のメソッドが持つことができるパラメータの最大数はいくつですか、またその理由は何ですか?
64 ビット Windows システムで Java 1.8 を使用しています。
これに関する StackOverflow の回答では、技術的な制限は 255 パラメータであると述べられていますが、その理由は明記されていません。
正確には、静的メソッドの場合は 255、非静的メソッドの場合は 254 (this
この場合は 255 番目) です。
これは何らかの仕様で記述でき、許可されるパラメータの最大数が静的に定義されているだけだと考えました。
しかし、これはint
およびすべての4バイト型パラメータを使用していくつかテストを実行しましたlong
が、その場合、宣言できるパラメータは 127 個だけでした。
パラメータの場合String
、テストから推測した許容数は 255 です (Java では参照サイズが 4 バイトだからでしょうか)。
しかし、64 ビット システムを使用しているため、参照サイズは 8 バイト幅である必要があり、String
パラメータの場合、許容される最大数はlong
型と同様に 127 である必要があります。
この制限は具体的にはどのように適用されるのでしょうか?
制限は何か関係があるのでしょうか?スタックサイズ方法の?
注: 実際には、どのメソッドでもこれほど多くのパラメータを使用するつもりはありませんが、この質問は正確な動作を明確にするためだけのものです。
ベストアンサー1
その制限は、JVM仕様:
メソッドパラメータの数255に制限されていますメソッド記述子の定義(§4.3.3)では、制限には1単位が含まれる。これインスタンスまたはインターフェース メソッドの呼び出しの場合。
セクション§4.3.3追加情報:
メソッド記述子は、メソッドパラメータの合計長が255以下の場合にのみ有効であり、その長さには、これインスタンスまたはインターフェース メソッドの呼び出しの場合。
全長は個々のパラメータの寄与を合計して計算されます。ここで、long型またはdouble型のパラメータは長さに2単位寄与し、その他の型のパラメータは長さに1単位寄与する。。
あなたの観察は正確です。ダブルワードプリミティブ(long
/ double
)は通常の4バイト変数の2倍のサイズが必要です。4バイトのオブジェクトインスタンス参照。
64ビットシステムに関する最後の質問については、仕様では、単位パラメータ寄与、仕様のその部分依然として遵守する必要があるStrings
64 ビット プラットフォームでも、64 ビット JVM は、内部オブジェクトのポインター サイズに関係なく、255 個のインスタンス パラメーター (255 など) に対応します。