ヒープのメモリ不足エラーが発生しましたが (好奇心から質問しただけです)、個々のスタックのサイズに同等の制限はありますか? そうでない場合、スタック フレームに余分なメモリが必要な場合 (何千ものローカル変数など)、このようなオーバーフローを防ぐものは何ですか?
3 に答える
スレッドが使用可能なスタック領域よりも多くのスタック領域を要求すると、StackOverflowError を受け取ります。
http://docs.oracle.com/javase/7/docs/api/java/lang/StackOverflowError.html
個々のスタック フレームのサイズはコンパイル時に決定され、メソッドのコードと共にクラス ファイルに格納されます。実際には、ローカル変数配列のサイズとオペランド スタックの深さの 2 つのフィールドがあります。どちらも 2^16-1 に制限されています。http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546
ランタイム スタックに割り当てられるスペースは、1 つの実行スレッドのすべてのスタック フレームを組み合わせたものだと思います。
デフォルトのサイズは、ほとんどの OS で異なります。これらのドキュメントを見てください。必要に応じて、-Xss
JVM パラメータを使用してサイズを増やすことができます。
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html
各スレッドは、スタック領域の独自の割り当てを取得します。Java コマンド ラインの -Xss オプションを使用して、この割り当ての大きさを設定できます。デフォルトはプラットフォームによって異なりますが、常に「スレッドごと」の量です。
制限は、スタック上のエントリ数ではなく、スレッドあたりのメモリ量です。