3

JVM 仕様は、JVM スタックが固定サイズまたは動的に拡張可能であることを示しています。

-Xss JVM オプションを使用すると、固定サイズを設定できます。このオプションを正しく設定しないと、デフォルト値 (約 512 ~ 2048k) が設定されますが、必要に応じてスタックを動的に割り当てるように JVM に指示するにはどうすればよいでしょうか?

動的サイズ オプションを設定できない場合、大きな -Xss 値 (たとえば 20M) を設定すると、実際には JVM の各スレッドに 20MB のメモリが割り当てられますか、それとも動的に割り当てられるメモリは 20MB に制限されますか?

4

2 に答える 2

9

最大スタック サイズは、スタックに割り当てられる仮想アドレス空間の量です。メモリは、必要な場合にのみスタックにコミットされます。

32 ビット システムでは、仮想アドレス空間は比較的希少なリソースであることに注意してください。プロセスごとに 4GB未満 (場合によってははるかに少ない) になります。これを念頭に置いて、20MB スタックはスレッド数を 75 から 175 の間に制限します。

于 2012-05-04T22:11:04.967 に答える
2

動的拡張に関しては、仕様ではサポートされていても、実装ではサポートされていない場合があります。

では、必要に応じてスタックを動的に割り当てるように JVM に指示するにはどうすればよいでしょうか。

あなたはそうしない。すべての設定をデフォルトのままにし、スレッド内の計算で許可されているよりも大きなスタックが必要な場合、Java 仮想マシンは StackOverflowError をスローします。

これは、-Xss を使用して、新しいスレッドへのメモリ割り当てを明示的に増やすための合図です。

これは、JVM ヒープには影響しません。[ヒープサイズの設定については -Xmx -Xms を参照]

また、1 スレッドあたり 20Mb はやや過剰に思えます。

すべては、ヒープのサイズと、サポートしたい同時スレッドの数によって異なります。

于 2012-05-04T23:38:42.467 に答える