8

Javaでは(おそらく.netでも)、プリミティブはスタックに格納されますが、参照型はヒープに格納されます。

私の質問は、この動作のproc/consを理解していないということでした。代わりに、スタック内のメモリ位置を参照できないのはなぜですか?。私はグーグルで適切な説明を見つけることができませんでした(多分私はそれを吸うかもしれません)、しかしあなたの人々がいくつかの洞察を提供することができれば私は感謝するでしょう

ありがとう。

4

4 に答える 4

9

Javaでは(おそらく.netでも)、プリミティブはスタックに格納され、参照型はヒープに格納されることを知っています。

いいえ。プリミティブか参照かに依存しません。スタックを使用するかヒープを使用するかはスコープによって異なります。オブジェクトがインスタンス化されると、ローカル変数はスタックに割り当てられ、メンバー変数はヒープに割り当てられます。

Java プリミティブはスタックまたはヒープに配置されますか?も参照してください。

私の質問は、この動作の賛否両論を理解していないということでした。

スタックに保存されたデータは、メソッドが実行されている間だけ存続します。メソッドが完了すると、スタックに割り当てられたすべてのデータが削除されます。ヒープに格納されたデータは、破棄されない限り存続します (Java の場合、破棄はガベージ コレクターによってバックグラウンドで行われます)。C/C++ などの他の言語では、ヒープに割り当てられたデータを明示的に削除/解放する必要があります。

次のコード スニペットを検討してください。

String someMethod() {
  int i = 0;
  String result = "Hello";

  i = i + 5;
  return result;
}

ここでは、スタック上にプリミティブ ( int i) が作成され、その上で何らかの計算が行われます。メソッドが終了すると、iアクセスできなくなり、その値は失われます。参照についても基本的には同じですresult。参照はスタックに割り当てられますが、オブジェクト (この場合は String オブジェクト) はヒープに割り当てられます。参照を戻り値として返すことにより、それが参照するオブジェクトはメソッドの外でも使用できます。

于 2012-12-17T11:23:14.033 に答える
6

メソッドが戻るとスタック フレームが破棄されるため、参照型をスタックに格納することは通常できません。メソッドの完了後に逆参照できるようにオブジェクトへの参照を保存した場合、存在しないスタックの場所を逆参照することになります。

HotSpot JVM はエスケープ分析を実行でき、オブジェクトがメソッド スコープをエスケープできない可能性があると判断した場合、実際にそのオブジェクトをスタックに割り当てます。

于 2012-12-17T11:27:19.040 に答える
1

参照型はヒープに格納されます。

その部分が何を意味するのか正確にはわかりませんが、オブジェクトのみが に保存されheap、それらのオブジェクトを指す参照はまだスタックにあることを覚えておいてください。おそらくこれはあなたが持っていた疑いでした。

stackここで、ローカル変数のみが に保存され、instance / member変数は に保存されることにも注意してくださいHeap

例: -

String str = new String("Rohit");  // Local variable

上記の場合、もちろん参照が何らかのローカルスコープで定義されている場合、str参照はメモリに割り当てられます。stackそして、 で作成された新しい文字列オブジェクトを指しますHeap

于 2012-12-17T11:24:33.080 に答える
0

代わりに、スタック内のメモリ位置を参照できないのはなぜですか?

この決定は、メモリ アーキテクチャの決定と考えることができます。

概念上、理想的には、データがその上にない場合、データを取得することはできませんstack。しかし実際には、プログラムのどこからでもアクセスできる場所が必要です。したがって、スタックすることはできません。そして彼らはそれを名付けましたheap

このリンクは、より多くの光を投げかける可能性があります。

于 2012-12-17T11:23:59.977 に答える