【发布时间】:2012-02-06 23:06:27
【问题描述】:
我想再次学习 Java,因为几年前我离开了它。读了一本书,我在理解 Java 如何在堆和堆栈中分配内存时遇到了问题。
这是我所理解的——我会尝试用例子来谈论它。
class TestA {
int a;
void methodA(int b) {
a = b;
}
int getA() {
return a;
}
}
这是一个展示不同情况的示例类。这是我的主要内容:
int b = 3;
TestA obj = new TestA();
obj.methodA(b);
obj.getA();
那么会发生什么?
##开始
STACK - 为 main 函数占用一些内存
堆 - 空
## int b = 3
STACK - [为 main 函数占用一些内存 -> 这里我们有 b]
堆 - [空]
## TestA obj = new TestA()
STACK - [为 main 函数占用一些内存 -> 这里我们有 b 和对 TestA 的引用]
HEAP - [为 int a 占用一些内存]
## obj.methodA(b);
STACK - [为 main 函数占用一些内存 -> 这里我们有 b 和对 TestA 的引用]
HEAP - [为 int a 占用一些内存] AND [为方法 A 占用另一个内存]
##执行方法A(int b)
STACK - [为 main 函数占用一些内存 -> 这里我们有 b 和对 TestA 的引用] AND [为 methodA() 占用内存 -> 这里我们在这个函数中使用了 b]
HEAP - [为 int a 占用一些内存] AND [为方法 A 占用另一个内存]
我们有:
- 堆中的对象和实例字段(原始或非原始)
- 堆栈中的函数和范围值
对吗?
【问题讨论】:
-
所有对象都分配在堆上。基元以及对对象的引用都在堆栈中。
-
您还可以跟踪堆内存使用情况,以便通过实验确认/否定您的理论。
-
看起来可行。但是我已经从事 Java 13 年了,我真的很想知道你为什么关心它。拥有垃圾收集器会使您无法专注于此。
-
@BrianRoach:并非所有原语都在堆栈上。只有原语是函数中的变量。实例(或类)的原始数据成员是堆上实例(或类)内存结构的一部分。
-
@Snicolas:确实,Java、C#、JavaScript 等的乐趣之一。人。是我们几乎从来不用关心这个。只有在调整 JVM 时才是真正的。
标签: java heap-memory stack-memory