问题描述
我想知道在有关变量声明和赋值的简单情况下如何分配内存。假设我们有以下内容:
int a;
据我所知,一旦我们 daclare int a; 就分配了 4 个字节; .但是,当我们为 a 赋值时,内存是如何工作的呢?我想以下内容在内存方面存在差异:
a = 1; a = 1000000;
所以,实际上,问题是赋值如何影响内存。
解决方法
局部变量由编译器在方法的调用栈上分配。
void f(int a,String b) {
String d = "";
for (int i = 0; i < 10; ++i) {
int c;
c = a*i;
d = d + b;
}
}
堆栈:
Compiler stores frame size of `f(int,String)`: 28
fp[0] int a
fp[4] String b
fp[12] String d
fp[16] int c
fp[24] int i
fp[28]
每次通话都会发生这样的事情:
checkStackCanReserveFrameWithSize(28); // can throw OutOfMemoryException
复制的是
- 原始类型的值,或
- 对象的对象引用。
所以没有分配分配。
在 d + b
之上进行分配, String.concat(String)
。
- 字段变量作为对象分配的一部分进行分配。
- 静态字段变量(全局字段)作为类初始化分配。