Java赋值后的内存分配

问题描述

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

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)

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