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

标签 java optimization

进一步解释我的问题。只需编写 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/

相关文章:

java - 当我使用 JPA 查询的 getResultList() 时,结果是分离的还是管理的?

c - 如果全局变量被中断修改,是否真的需要 volatile 修饰符?

java - 我正在尝试填充图表,存储探索的节点的最优化方法是什么?

java - 何时在 Java 中使用异常(示例)

java - 为什么要同时使用 boolean 值和 interrupt() 来指示线程终止?

java - 使用 Activiti 引擎在集群应用程序上执行异步服务任务

optimization - ElasticSearch 批量操作 - 省略响应

java - 动态读取Excel并存储在 map 中

css - 将开发 CSS 中的导入合并到 1 个文件中以进行生产

c++ - 如何使用 SSE 或 GLSL 优化 "u[0]*v[0] + u[2]*v[2]"代码行