2017-02-16 20 views
1

Javaでは、オブジェクトはヒープに格納されますが、メソッドローカル変数はスタックに格納されます。しかし、jconsoleを開くと、スタックに割り当てられているメモリはありません。私はちょうどヒープとpermgen(Java 6)を参照してください。スタックは物理的ではなくヒープ内の論理的な分離であるか?ヒープ内に論理メモリ領域をスタックしていますか?

+1

[JVMヒープのフレームが割り当てられているか、スタックに割り当てられていますか?](http://stackoverflow.com/questions/26741925/is-frame-in-jvm-heap-allocated-or-stack-allocated/26779782#26779782) )と[どのように私はプログラムでスタックメモリの統計情報を取得するのですか?](http://stackoverflow.com/questions/26835087/how-do-i-get-stack-memory-stats-programatically/26852490#26852490) – apangin

+0

私はお勧めしますJava 6から8に移行し、できるだけ早く 'jconsole'から' jmc'に移行します。 –

+0

'jconsole'がこの情報を表示しないという事実は、スタックの構成についてのいかなる結論も許可しません。 – Holger

答えて

1

JVMは、プロセスのネイティブスタックを使用します。これは、オーバーヘッドを最小限に抑え、スタックを仮想にすることができます(実際に使用されているものよりもはるかに大きな最大サイズを持つことができます)。

結果として、ほとんどのスタックはあまり使用されません(最大値の10%の< <)役に立つよりも混乱するかもしれません。

+0

'JVMはプロセスのネイティブスタックを使用します.'私は、OSによってプロセスに割り当てられたメモリを意味すると信じています。それから、-Xmsと-Xmxのパラメータを使って前述のヒープとは別にする必要があります。 ? – emilly

+0

@emilly仮想メモリ/アドレス空間のみが割り当てられます。これが起こると、タッチされたページだけが実際のメモリに変わります。最大値を10 MBに設定しても21 KBしか使用しない場合、6 * 4 KBが実際に使用されます(24 KB)スタックの最大サイズを設定できますこれはめったに必要ありませんが、 '-Xss'で実行します。 –

+0

申し訳ありません。私は合計4GBのRAMを持っていると言う。ヒープ用に1GBの最大メモリを割り当てました。何らかの理由でスタックに512Mのメモリが必要な場合、3GB(4-1)から割り当てられますか? – emilly

1

いいえスタックは、メソッドの呼び出しに関連する情報(引数の値など)を保持するための専用領域で、メソッドが返った後にプログラムのフローが返される場所です。

+0

次に、スタック領域のメモリ解析がjconsoleなどのメモリアナライザツールに表示されない理由 – emilly

+0

@emillyスタックのサイズはめったに問題にならないでしょう。 –

+0

メソッド呼び出しごとにスタックが変化して戻ります。アナライザツールは何を報告しますか? –

関連する問題