単一責任の原則の重要性は理解していますが、技術的に言えば、各Javaメソッド内のローカル変数(スタックフレームに格納される変数)の数に上限はありますか。そして、その上限は最大スタックサイズに等しいですか?つまり、最大スタックサイズに等しいサイズのスタックフレームを構成できますか?
3 に答える
ローカル変数の数を定義する際に上限はありません。スタックフレームに収まらない変数を定義しすぎると(または)JVMがそのサイズのスタックフレームを割り当てることができなかった場合、JVMはスローStackOverflowError
して終了します。
あなたを助けるかもしれないスタンフォード大学の教授による良い講義があります。
これは実際には、ランタイムと、プロセスごとに割り当てられるスタックスペースの量によって定義されます。
この明確な質問に対する正解がないことに驚いています。JVMの最大フレームサイズは65535ローカル、最大スタックサイズは65535で、エントリごとに2つのスロットlong
をdouble
消費します。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のスタックがあります。