2011-12-08 7 views
0

この例では、誰でもメモリが賢明になる(Stack &ヒープ)と説明できますか?私が正しく理解すると、javaはヒープ上にオブジェクトを格納するので、i1はヒープ上にあります...文字列と同じですか?しかし、それがクラスフィールド宣言であると考えると、i2はどうでしょうか?Java(Stack&Heap) - この単純な例ではメモリが賢明になる

public ExampleClass { 
    Integer i1=new Integer(1); 
    int i2 = 2; 
    String str = "abc"; 
} 
+1

もしそれが 'ExampleClass'オブジェクトの一部なら、どこで終わるでしょうか? –

答えて

0

new ExampleClass()のようなコードがない限り、何も起こりません。これを行うと、新しいオブジェクトがヒープに割り当てられます。その中には、i1,i2、およびstrへの言及が含まれる。私はあなたが方法でないので、i2が自動的にInteger i2 = new Integer(0)に相当するものの裏に変換されることを推測しています。これらのうちの3つすべて参照は、ヒープ上にも割り当てられたオブジェクトを指しています。文字列は不変であるので、値​​を持つStringがすでに存在する場合は、その参照が指すことがあります。スタック店で

+3

"i2は自動的にシーンの背後でInteger i2 = new Integer(0)と同等に変換されます。そうではありません。 –

1

これらはすべてヒープに格納されます。 SOタグとして

は言う:

ヒープは、動的割り当てのために確保されたプロセスのメモリです。

したがって、変数はすべてヒープに配置されます。

ただし、任意のプリミティブタイプ(int,floatなど)はスタックに格納されます**メソッド内でローカルに割り当てられている場合のみ)。

詳細はhereをご覧ください。

0

非常に簡潔:Stack: [i1-addr, 2, str-addr]Heap : [i1-addr : 1, str-addr : 'a','b','c']です。ヒープの場合は、表記[addres: value]を使用します。もちろん、ヒープの値ヒープの一部には、オブジェクト情報(例:.classオブジェクトへのリンク)も含まれています。

0
public ExampleClass { 
    Integer i1=new Integer(1); //heap 
    int i2 = 2; //heap 
    String str = "abc"; //permGen 
} 

一つだけスレッドが利用可能のみローカルインスタンス/プリミティブヒープは、(スレッドの任意の数が使用可能な)共有プレースで、 permGenはインターンを格納するために使用されるJavaメモリの別の一部であります文字列クラスとロードされたクラス。

0

すべての初期化された値がコンストラクタで設定されます。コンストラクタ内では、参照はスタックに配置され、次にヒープ上のフィールドに配置されます。コンストラクタが返されると、オブジェクト自体への参照はスタックに残りますが、すべてのフィールドはヒープ上にのみ存在します。

関連する問題