1. ホーム
  2. java

[解決済み] デフォルトのスタックサイズ、スタックサイズを大きくすることは可能ですか?

2023-05-26 15:15:49

質問

私は、各スレッドがそれぞれ stack . プリミティブ型と参照はスタックに保持され、オブジェクトはスタックに保持されないということです。

私の質問は

  • スタックはどのくらい大きくなるのでしょうか?(パラメータで Xms と - Xmx )
  • 成長を抑えることができるのか?
  • スタックにデフォルトの最小値、最大値はありますか?
  • ガベージコレクションは、スタック上でどのように動作しますか。

どのように解決するのですか?

スタックはどのくらい伸びるのでしょうか?

という VM オプションを使用することができます。 ss という VM オプションを使用して、最大スタックサイズを調整することができます。VMオプションは通常-X{option}で渡されます。ですから java -Xss1M でスタックサイズの最大値を1Mに設定します。

各スレッドは少なくとも1つのスタックを持っています。Java仮想マシン(JVM)の中には、Javaスタック(Javaメソッドコール)とネイティブスタック(VM内のネイティブメソッドコール)を一つのスタックにまとめ、quot;Managed to Native Frame" として知られているものを使ってスタックの巻き戻しを行うものがあります。 M2nFrame . 一部のJVMは、2つのスタックを別々に保持しています。その場合 Xss は、ほとんどの場合、Javaスタックのサイズを設定します。

多くのJVMでは、プラットフォームごとにスタックサイズに異なるデフォルト値を置いています。


この成長を制限することは可能ですか?

メソッド呼び出しが発生すると、そのスレッドのスタックに新しいスタックフレームが作成されます。スタックにはローカル変数、パラメータ、リターンアドレスなどが含まれます。Java では、スタックにオブジェクトを置くことはできず、スタックに格納できるのはオブジェクトの参照だけです。Javaでは配列もオブジェクトなので、配列もスタックに格納されません。ですから、ローカルプリミティブ変数やパラメータをオブジェクトにまとめるなどして量を減らせば、スタック上の容量を減らすことができます。実は、Javaのスタックに明示的にオブジェクトを置けないことが、パフォーマンスに影響を与えることがあります(キャッシュミス)。


スタックにはデフォルトの最小値または最大値がありますか?

先ほども言ったように、VM によって異なるため、バージョンアップで変更される可能性があります。以下を参照してください。 を参照してください。 .


ガベージコレクションはスタック上でどのように動作するのですか?

Javaにおけるガベージコレクションはホットなトピックです。ガベージコレクションの目的は、到達不可能なオブジェクトをスタックに集めることです。 ヒープ . そのため、「到達可能」の定義が必要なのです。スタック上のすべてのものは、GCにおけるルートセット参照の一部を構成しています。すべてのスレッドのすべてのスタックから到達可能であるすべては、ライブとして考慮されるべきです。Threadオブジェクトといくつかのクラスオブジェクトのような、いくつかの他のルートセット参照があります。

これは、GC上のスタックの非常に漠然とした使用法でしかありません。現在、ほとんどのJVMは世代別GCを使用しています。 この記事 は、JavaのGCについて簡単に紹介しています。そして最近、私は は非常に良い記事です。 .NETプラットフォームでのGCについて話している。Oracle JVMのGCはかなり似ているので、これも役に立つと思います。