2012-04-13 13 views
2

メインスレッドのスタックサイズを動的に(実行時に)増やす方法があるかどうか知りませんか?また、それと同じ質問だと思いますが、そのインスタンス化後にThreadのスタックサイズを増やしたり、更新したりすることは可能ですか?実行時にJavaスレッドのスタックサイズを更新する

ThreadのCTORではスタックサイズを定義できますが、それを更新する方法はありません。実際には、私はJDKのスタックサイズを管理していませんでした(これは不可能であることを示す傾向があります)、すべてがVMで実行されます。

「スタックが作成されたときに」スタックサイズを設定することが可能であるが、ノートがあるjava language specificationによると:

A Java仮想マシンの実装は、最初のオーバープログラマやユーザコントロールを提供することができますJava仮想マシンスタックのサイズ、動的に拡張または縮小するJava仮想マシンスタックの場合は、最大サイズと最小サイズを制御します。

IMOそれは非常に明確ではないですが、それは一部のVMがMAX(編集)与えられた範囲内進化スタックサイズのスレッドを処理することを意味するのでしょうか?私たちはHostpotでそれを行うことができますか(私はXssの横のスタックサイズ関連のオプションは見つけられませんでした)?

ありがとうございます!

+0

http://stackoverflow.com/questions/3700459/how-to-increase-to-java-stack-sizeこの質問をチェックしましたか? Theresは直接的な答えはありませんが、スタックサイズ管理についての良い議論です。 – kommradHomer

+0

@kommradHomer面白いですが、私が探しているものではありません。私は、スレッドが既に実行されているときにスタックサイズを更新できるかどうかを知りたい(極端な場合、スタックオーバーフローでクラッシュする代わりに、スレッドがスタックサイズを増やして '適合'を試みる)。 – Jerome

答えて

4

スタックサイズはdynamcally自体が更新されます。

設定可能な最大サイズは-Xssです。これは使用される仮想メモリサイズであり、64ビットJVMで好きなだけ大きくすることができます。使用される実際のメモリは、使用するメモリの量に基づいています。 ;)

編集重要な違いは、最大サイズが仮想メモリとして予約されていることです(ヒープbtwも同様です)。すなわち、アドレススペースは予約されているため、拡張できない理由もある。 32ビットシステムではアドレス空間が限られていますが、これは依然として問題になります。しかし、64ビットシステムでは、最大256 TBの仮想メモリ(プロセッサ制限)があるため、仮想メモリは安価です。実際のメモリはページ(通常は4 KB)に割り当てられ、使用時にのみ割り当てられます。このため、起動時に最大ヒープサイズが割り当てられても、Javaアプリケーションのメモリは時間の経過と共に増加するように見えます。スレッドスタックでも同じことが起こります。実際にタッチされたページだけが割り当てられます。

+0

よろしくお願いします。それは私の質問に答えることはできませんが、私はそれを尋ねた理由は間違っていたと指摘しました。実際には、いったんスレッドを作成すると、全体のスタックサイズ(最大)が予約されていたことが分かりました(断片化などを防ぐため)。それは間違っている:)したがって、最大スタックサイズが小さいスレッドを作成する必要はありません。メモリを消費しなくても、最終的に最大スタックサイズを調整する必要があります。 – Jerome

+0

ちょっとピーターを説明する気に?これは、私が-Xss104K(minimum)を実行でき、StackOverflow例外を心配する必要がないことを意味しますか?それはJVMが自動的に各スレッドのstaackサイズを104kに近づけるためです。または? – kellogs

+0

@kellogsオペレーティングシステムは、プロセスにページを割り当てます。最大値を1 MBに設定し、100 KBを超える値を使用しない場合、OSはそのスレッドに対してそのプロセスに100 KBのページしか割り当てません。これは、異なるスレッドが同じ最大値を持ち、スタックの使用方法が異なるため、うまく機能します。 –

3

あり、標準のJDKでこれを行う方法はありません、とさえstackSize引数が石に設定されていません。

STACKSIZEパラメータの効果は、もしあれば、非常にプラットフォームに依存しています。 ... 一部のプラットフォームでは、stackSizeパラメータの値はまったく影響を与えません。 ...仮想マシンは、stackSizeパラメータを自由に扱うことができます。

あなたがするので、この必要はありませんので、それが使用されるような(originalで強調。)

+0

「石にセット」すると、最終的な意味ですか?はい、なぜ彼らは最終変数としてstackSizeを設定していませんでしたか?それが不可能な場合は最終的な変数にしませんでした-_-スレッドのstackSize変数が実行開始後に更新されるかどうかをチェックしました。 0,13)。私はopenJDKを何時間もチェックする気がしません:s – Jerome

+0

いいえ、 'stackSize'を' Thread's'コンストラクタに渡しても、JVMが気にする保証は全くありません。ドキュメントは、JVMがあなたの議論を単なる提案として扱うことも、それを完全に無視することも自由であると明示しています。 – yshavit

関連する問題