【问题标题】:Memory allocation after assigning a value in Java在 Java 中赋值后的内存分配
【发布时间】:2024-01-08 12:28:01
【问题描述】:

我想知道在变量声明和赋值的简单情况下如何分配内存。假设我们有以下内容:

int a;

据我所知,一旦我们 daclare int a; 分配了 4 个字节; .但是,当我们为 a 赋值时,内存是如何工作的呢?我想以下之间在内存方面存在差异:

a = 1; a = 1000000;

所以,实际上,问题是赋值如何影响内存。

【问题讨论】:

  • "所以,实际上,问题是赋值如何影响内存。" - 对于ints(或者实际上是八个原语中的任何一个),它确实不是。这两个值都是 32 位整数,因此消耗的内存量完全相同。
  • 有趣,这就是为什么声明在分配的内存方面很重要。我想其他原始类型也是如此?我猜对于 String 来说,故事是不同的。感谢您的回答。 @图灵85

标签: java memory-management declaration dynamic-memory-allocation


【解决方案1】:

编译器在方法的调用栈上分配局部变量。

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

复制的是

  • 原始类型的值,或
  • Object 的对象引用。

所以没有分配分配。

d + b 上方进行分配, String.concat(String)

  • 字段变量作为对象分配的一部分进行分配。
  • 静态字段变量(全局字段)作为类初始化分配。

【讨论】:

  • static 方法的第一个条目将是this。除此之外,i 首先出现在示例源代码中。原则上,编译器可以根据自己的喜好为ic 分配位置,但为简单起见,我将使用源代码出现顺序(在实践中也会发生)。值得注意的是,栈的内存通常是在线程创建时分配的。
  • @Holger 谢谢,有用的信息,我简化了。热
最近更新 更多