2012-11-01 4 views
5

私は、Javaのメモリ配置の仕組みを十分に理解しようとしています。インターネット上の議論は非常に混乱し、時には互いに矛盾するので、私は信頼できる人は誰も見つかりませんでした。静的メソッド、静的メソッド、ローカル変数、スレッド、揮発性などが混在すると、このことは非常に複雑になります。だから私は自分自身でJavaコーディング実験をやっていることを勉強できる方法があれば、私は考えています。クラスMemoryTrackはこのような何かをし、Javaでは、変数、メソッド、またはクラスがヒープまたはスタックで作成されたかどうかを追跡する方法はありますか?

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" 
} 
+0

これを回答として投稿してください。 –

+1

いずれにせよ、Javaのポイントの1つは、ヒープ上に何があるのか​​、何がスタック上にあるのか気にする必要がないということです。実際、JITは通常スタック上に何かが起こる可能性があるヒープ。 –

+0

@Zoltán:done。 - – ignis

答えて

7

メモリの使用がSection 2.5 of the Java Virtual Machine Specificationに記載されています。スタックにはスタックフレーム(ローカル変数と部分的な結果を含む)が格納されます。ヒープは、すべてのクラスインスタンスと配列がどこから来るかです。スタックフレームは、ヒープから割り当てられます(スタックにプッシュされます)。メソッド領域と実行時定数プールメモリもあります。詳細はスペックに記載されています。

メモリの使用状況を監視する限り、いくつかのプロファイラにはツールがあります。プログラム内から監視するには、MemoryMXBeanクラス(およびjava.lang.managementパッケージ内の関連するクラス)を見てください。それは非常に使いやすいです。それはおそらく、あなたが望むように聞こえるものすべてを与えるわけではありませんが、おそらくそれが利用可能な最良のものです。

3

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

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

-1

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

+2

実際、[Java仮想マシンの仕様](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5)に詳しく記載されています。実装に依存する唯一の機能は、スタックの構造、スタックフレームがヒープから割り当てられているかどうか、OPの質問の周辺にある他のいくつかの問題です。 –

+0

私は彼らがここでJava 7またはJava 6のいずれかを変更したと聞きました... – Dims

+1

上記のリンクはSE 7です。[SE 5の仕様](http://docs.oracle.com/javase/specs/jvms /se5.0/html/Overview.doc.html#1732)は、このトピックの言語がほとんど同じです。 –

1

2つのことは、あなたが知っている必要があり

  • そのないあなたが思うほど複雑。
  • 時間の99%は関係ありません。

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

オブジェクトは常にヒープ上にあります。 (例外はありますが、私はそれらについて心配しません)

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

HotSpot/OpenJDK JVMでは、スタティックフィールドはクラスのシングルトンオブジェクトに集められます。ヒープ・ダンプを実行するとインスタンスが表示されます。他のJVMはこれを別々に行うかもしれません。

クラスMemoryTrackは、引数は常にスタック上にあると、それは常にヒープ上になりますを参照するオブジェクトになるような方法が有用何もしないだろう、このような何か、

を行います。標準的な方法でオブジェクトのメモリ位置を取得することはできませんし、いつでも変更できるようにした場合には便利ではありません。

関連する問題