如何理解《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:存储在堆中
如果是存储在堆中的话,何来高效一说?
PHP中文网2017-04-18 10:54:21
内存分为堆和栈,这你已经知道了。
堆内存是属于JVM的,栈内存是属于方法的,方法结束了,栈内存也就没了。
程序运行main函数时,有一个堆内存,一个main的栈内存
int var3 = 0;
这个var3,是放在main函数的栈内存中的,是一个值。
之后
demo obj1 = new demo();
main函数的栈内存中有了一个引用变量,obj1,指向了堆内存中new出来的这个实例。
我们再看堆内存中的这个实例,他有2个字段,他们都是存放在堆中的。
等到main函数运行结束时,假如还有别的线程在运行,JVM还没有结束,此时,main函数的栈内存被清除,var3,不在了,obj1这个引用变量也不在了,但是堆内存中的那个实例依然在,如果没有别的引用变量 指向它 ,那么它将在稍后被清除。
巴扎黑2017-04-18 10:54:21
是翻译错误,译文中用的是stack,即栈,而不是堆栈。以下是译文:
特殊情况:原始类型
您在编程中经常使用的一组类型会得到特殊对待。您可以将它们视为“原始”类型。进行特殊处理的原因是,用 new 创建对象(尤其是小而简单的变量)效率不高,因为 new 将对象放置在堆上。对于这些类型,Java 依赖于 C 和 C++ 所采用的方法。也就是说,不是使用 new 创建变量,而是创建一个不是引用的“自动”变量。变量直接保存值,并且放在栈上,所以效率更高