6

単一責任の原則の重要性は理解していますが、技術的に言えば、各Javaメソッド内のローカル変数(スタックフレームに格納される変数)の数に上限はありますか。そして、その上限は最大スタックサイズに等しいですか?つまり、最大スタックサイズに等しいサイズのスタックフレームを構成できますか?

4

3 に答える 3

4

ローカル変数の数を定義する際に上限はありません。スタックフレームに収まらない変数を定義しすぎると(または)JVMがそのサイズのスタックフレームを割り当てることができなかった場合、JVMはスローStackOverflowErrorして終了します。

あなたを助けるかもしれないスタンフォード大学の教授による良い講義があります。

于 2012-10-18T18:45:33.423 に答える
3

これは実際には、ランタイムと、プロセスごとに割り当てられるスタックスペースの量によって定義されます。

于 2012-10-18T18:45:23.923 に答える
2

この明確な質問に対する正解がないことに驚いています。JVMの最大フレームサイズは65535ローカル、最大スタックサイズは65535で、エントリごとに2つのスロットlongdouble消費します。JVM仕様4.11から。Java仮想マシンの制限

  • メソッドの呼び出し時に作成されるフレームのローカル変数配列内のローカル変数の最大数(§2.6)は、Code属性(§4.7.3)のmax_locals項目のサイズによって65535に制限されます。メソッド、およびJava仮想マシン命令セットの16ビットローカル変数インデックス付けによる。

    long型とdouble型の値は、それぞれ2つのローカル変数を予約し、max_locals値に2単位貢献すると見なされるため、これらのタイプのローカル変数を使用すると、この制限がさらに減少することに注意してください。

  • フレーム内のオペランドスタックのサイズ(§2.6)は、Code属性(§4.7.3)のmax_stackフィールドによって65535の値に制限されています。

    long型とdouble型の値は、それぞれmax_stack値に2単位貢献すると見なされるため、オペランドスタックでこれらの型の値を使用すると、この制限がさらに減少することに注意してください。

Java言語は、理論的にはローカルをオフロードしてヒープにスタックすることでこのJVMの制限を回避できますが(これはかなり大きくなる可能性があるため)、実際にはそうではありません- javac(少なくともJava 15の時点では) 65535ローカルまたは深さ65535のスタックがあります。

于 2020-12-04T06:08:53.573 に答える