如何理解《Java编程思想-第四版》P23 中,这个变量直接存储“值”,并置于堆栈中,因此更加高效
一句中的 “堆栈” 两字,到底是堆还是栈?情况如下:
class demo {
private int var1; // 字段1
private Integer var2; // 字段2
public static void main(String[] args) {
int var3 = 0; // 变量1
demo obj1 = new demo(); // 实例1
}
}
参考《Java编程思想-第四版》P23 和 《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》P39-P43,对于该 demo
实例1:存储在堆内存中
变量1:存储在方法栈中
实例1中的字段1:存储在堆中
实例1中的字段2:存储在堆中
如果是存储在堆中的话,何来高效一说?
PHPz2017-04-18 10:54:21
すべての基本的なタイプのデータがスタックに配置されると一般化して言うことはできません。 クラス インスタンスがプリミティブ型を持つ場合、そのプリミティブ型はヒープに配置されます!
PHP中文网2017-04-18 10:54:21
メモリはヒープとスタックに分割されます。これはすでにご存知でしょう。
ヒープメモリはJVMに属し、スタックメモリはメソッドに属します。メソッドが終了すると、スタックメモリはなくなります。
プログラムがメイン関数を実行すると、ヒープメモリとメインスタックメモリが存在します
int var3 = 0;
この var3 は main 関数のスタック メモリに配置される値です。
demo obj1 = new Demon(); の後
main 関数のスタック メモリ内に、ヒープ メモリ内の新しいインスタンスを指す参照変数 obj1 があります。
main 関数が終了するとき、他のスレッドが実行されている場合、JVM はまだ終了していません。main 関数のスタック メモリはクリアされ、var3 は存在せず、参照変数 obj1 も存在しません。ですが、ヒープ メモリ内には のインスタンスがまだ存在しており、他の参照変数がそれを指していなければ、後でクリアされます。
巴扎黑2017-04-18 10:54:21
は翻訳文であり、原文では stack、つまり、スタックではなく、 が使用されます。
特殊なケース: プリミティブ型プログラミングで頻繁に使用するタイプの 1 つのグループが特別に扱われます。これらは「プリミティブ」タイプと考えることができます。特別な処理を行う理由は、new を使用してオブジェクトを作成する (特に小さくて単純な変数) と、new がオブジェクトをヒープ上に配置するため、あまり効率的ではないためです。これらの型の場合、Java は C および C++ が採用するアプローチを利用します。つまり、new を使用して変数を作成する代わりに、参照ではない「自動」変数が作成されます。変数は値を直接保持し、
スタックに配置されるため、はるかに効率的です。
返事0