gpt4 book ai didi

java - 声明但不初始化对象是否分配内存?

转载 作者:行者123 更新时间:2023-12-02 02:51:14 27 4
gpt4 key购买 nike

进一步解释我的问题。只需编写 String foo; 即可分配内存。还是只有在第一次给变量赋值时才预留内存?谢谢。

最佳答案

我将以不同的方式回答这个问题,因为我认为链接的(重复的)答案是错误的。

内存IS在您声明引用时分配。

public MyClass {
public String s;
}

该引用s堆上需要 8 个字节(通常是大多数 JVM)。内存必须在那里。

现在,当您分配它时,会分配更多内存。

public static void main( String args... ) {
MyClass c = new MyClass();
c.s = new String("Hello Memory");
}

字符串"Hello Memory"也占用内存,但引用s仍然占用堆上的 8 个字节,并且是 MyClass 时分配的内存的一部分。被创建。此外,所有 Java 对象在堆上都有大约 8 个字节的额外开销(所有 Java 对象都有一个与其关联的监视器,因此需要开销)。

并且在方法main中, c除了 new 占用的内存外,还占用 8 个字节(在堆栈上)。需要在堆上分配。我真的认为如果你想了解内存是如何工作的,你需要考虑这种分配。

<小时/>

我可能会把这个搞砸,因为内存分配变得很棘手,但这个程序是如何分配内存的,从 main 开始.

第一cmain 时分配被调用:8字节。

然后new MyClass()在堆上分配 16 个字节(s 的大小 + 8 个字节的开销)。

接下来,(你准备好了吗?)new String("Hello Memory");在堆上分配 48 个字节。为什么? Java 字符串声明如下:

public final String {
private final char[] string;
private int hashcode;
}

因此字符串对象需要 8 个字节的开销,加上数组的 12 个字节的开销(数组是对象,也需要数组的长度,所以正常的 8 个字节的开销 + 4 个字节的长度)。 hashcode字段另外占用 4 个字节,字符串数据“Hello Memory”占用 24 个字节(12 chars 每个 2 个字节)。如果我这样做正确的话,它加起来将达到 48 个字节。 C 程序员要么笑,要么哭。

关于java - 声明但不初始化对象是否分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43815698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com