首页 > 解决方案 > 在 Java 中赋值后的内存分配

问题描述

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

诠释一个;

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

a = 1; a = 1000000;

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

标签: javamemory-managementdeclarationdynamic-memory-allocation

解决方案


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

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).

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

推荐阅读