5

Java がそのメモリ配置でどのように機能するかを完全に理解しようとしています。インターネット上の議論は非常に混乱しており、時には互いに矛盾しているため、信頼できる人が見つかりませんでした. 静的、静的メソッド、ローカル変数、スレッド、揮発性などと混合すると、これは非常に複雑になる可能性があります。そこで、Java コーディングの実験を自分で行っていることを勉強できる方法があるかどうかを考えています。クラス MemoryTrack は次のようなことを行います。

public myMethod(){
int i = 0;
MemoryTrack.show(new myClass()); //print out "Heap at address 111"
MemoryTrack.show(new myClass()); //print out "Heap at address 222"
MemoryTrack.show(i); //print out "Stack at address 333"
MemoryTrack.show("a static method");  //print out "stack at address 444"
}
4

4 に答える 4

7

メモリの使用については、Java 仮想マシン仕様のセクション 2.5 で説明されています。スタックには、スタック フレーム (ローカル変数と部分的な結果を含む) が格納されます。ヒープは、すべてのクラス インスタンスと配列の元になる場所です。スタック フレームは、ヒープから割り当てることもできます (その後、スタックにプッシュします)。メソッド領域とランタイム定数プール メモリもあります。詳細はスペックに書いてあります。

メモリ使用量の監視に関する限り、いくつかのプロファイラーにはそのためのツールがあります。プログラム内から監視するには、MemoryMXBeanクラス (およびjava.lang.managementパッケージ内の関連クラス) を参照してください。使い方はとても簡単です。おそらく、あなたが望むように聞こえるすべてのものを提供するわけではありませんが、おそらく利用可能な最高のものです.

于 2012-11-01T17:34:59.433 に答える
3

ルールは非常に単純です。ヒープにはオブジェクトが含まれ、スタックにはローカル変数とメソッド パラメーターが含まれます。オブジェクト フィールドはオブジェクト内のヒープにあります。静的フィールドについてはわかりません。メソッドとコンストラクターは、スタックにもヒープにも格納されません。スレッドと揮発性は関係ありません。

メソッド呼び出しはスタックにあります。それぞれに、ローカル変数とパラメーターを含むスタック フレームというスペースが予約されています。

于 2012-11-01T17:35:17.343 に答える
1

知っておくべき2つのこと

  • あなたが思うほど複雑ではありません。
  • 99%の場合は問題ありません。

変数は常にスタックにあります。

オブジェクトは常にヒープ上にあります。(例外もありますが、気にしないでください)

メソッドとクラスは常に perm gen にあります。

HotSpot/OpenJDK JVM では、静的フィールドはクラスのシングルトン オブジェクトに収集されます。ヒープ ダンプを実行すると、インスタンスが表示されます。他の JVM ではこれが異なる場合があります。

クラス MemoryTrack は次のようなことを行います。

このようなメソッドは、引数が常にスタック上にあり、それが参照するオブジェクトが常にヒープ上にあるため、何も役に立ちません。オブジェクトのメモリ位置を標準的な方法で取得することはできません。取得したとしても、いつでも変更される可能性があるため、あまり役に立ちません。

于 2012-11-01T18:46:33.500 に答える
-1

Javaのすべての変数がヒープ上にあると思うかもしれません。実際には、実装に依存します。

于 2012-11-01T17:37:49.223 に答える