java 基本数据类型各种情况下在内存中存储位置?
问题描述
问题:如何理解《Java编程思想-第四版》P23 中,这个变量直接存储“值”,并置于堆栈中,因此更加高效一句中的 “堆栈” 两字,到底是堆还是栈?情况如下:
class demo { private int var1; // 字段1 private Integer var2; // 字段2 public static void main(String[] args) {int var3 = 0; // 变量1demo obj1 = new demo(); // 实例1 }}我的理解
参考《Java编程思想-第四版》P23 和 《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》P39-P43,对于该 demo
实例1:存储在堆内存中
变量1:存储在方法栈中
实例1中的字段1:存储在堆中
实例1中的字段2:存储在堆中
如果是存储在堆中的话,何来高效一说?
问题解答
回答1:我们不能一概而论的说,基本类型数据都是放在栈中的!当某个 类实例 中具有基本类型时,基本类型就放在堆中!
回答2:内存分为堆和栈,这你已经知道了。
堆内存是属于JVM的,栈内存是属于方法的,方法结束了,栈内存也就没了。
程序运行main函数时,有一个堆内存,一个main的栈内存
int var3 = 0;这个var3,是放在main函数的栈内存中的,是一个值。
之后demo obj1 = new demo();main函数的栈内存中有了一个引用变量,obj1,指向了堆内存中new出来的这个实例。
我们再看堆内存中的这个实例,他有2个字段,他们都是存放在堆中的。
等到main函数运行结束时,假如还有别的线程在运行,JVM还没有结束,此时,main函数的栈内存被清除,var3,不在了,obj1这个引用变量也不在了,但是堆内存中的那个实例依然在,如果没有别的引用变量 指向它 ,那么它将在稍后被清除。
回答3:是翻译错误,原文中用的是stack,即栈,而不是堆栈。以下是原文:
Special case: primitive typesOne group of types, which you’ll use quite often in your programming, gets special treatment. You can think of these as “primitive” types. The reason for the special treatment is that to create an object with new—especially a small, simple variable—isn’t very efficient, because new places objects on the heap. For these types Java falls back on the approach taken by C and C++. That is, instead of creating the variable by using new, an “automatic” variable is created that is not a reference. The variable holds the value directly, and it’s placed on the stack, so it’s much more efficient.
回答4:p22,堆栈指的是stack,堆指的是heap
相关文章:
1. docker绑定了nginx端口 外部访问不到2. boot2docker无法启动3. macos - mac下docker如何设置代理4. dockerfile - 为什么docker容器启动不了?5. docker start -a dockername 老是卡住,什么情况?6. 网页爬虫 - python爬虫翻页问题,请问各位大神我这段代码怎样翻页,还有价格要登陆后才能看到,应该怎么解决7. docker内创建jenkins访问另一个容器下的服务器问题8. 在mac下出现了两个docker环境9. mac连接阿里云docker集群,已经卡了2天了,求问?10. dockerfile - 我用docker build的时候出现下边问题 麻烦帮我看一下