基元与参考的内存分配

时间:2017-06-25 01:18:37

标签: java variables memory-management

我已经读过其他答案,在初始化后,内存被分配给参考变量 ,这与在声明时正确分配内存的原语相反,即使它们没有被初始化!

示例:

public class Testing {
    public static void main(String[] args) {
        String name;            // no memory allocation
        String name2 = null;    // memory allocated
        int num;                // memory allocated
    }
}

这到底有多大?

2 个答案:

答案 0 :(得分:1)

这些是局部变量,因此在堆栈上分配。甚至引用也只是堆栈中4字节指针到堆(或元空间)中的区域。

由于它们是在堆栈上分配的,因此在调用函数时会同时为所有局部变量分配内存。这里没有对参考文献或原语的特殊处理。

至于何时初始化它们的值,简短的答案是编译器可能不会在它必须之前初始化它们,但可以自由地重新排序语句。

我们可以通过查看编译器使用'javac Testing.java&&amp ;;生成的字节码来验证这一点。 javap -c测试'

public class Testing {
    public static void main(String[] args) {
        int n;
        String name = "name";
        n = 1;
        System.out.println(name + n);
    }
}

 public static void main(java.lang.String[]);
    Code:
       0: ldc           #2    // load constant "name"
       2: astore_2            // initialize name to "name"
       3: iconst_1            // load constant 1
       4: istore_1            // initialize n to 1
/** do println stuff */

注意,即使它是第一个语句,也没有与int n声明相对应的指令。

答案 1 :(得分:0)

对于原始数据类型,它确定分配固定的内存量 在link中你可以阅读更多内容 作为参考,它只分配32位,可以保存对象示例的地址

  

字符串名称;

仅分配32位来保存字符串对象的地址 稍后当对象被实例化时,jvm为对象分配内存并将地址保存在引用变量