【问题标题】:Memory allocation : How much space does a reference occupy in Java?内存分配:Java 中引用占用多少空间?
【发布时间】:2009-08-28 16:10:39
【问题描述】:

我们用Java写了一段代码:

A a1;
a1 = new A();

编译器编译代码时保留多少字节内存:

A a1;

【问题讨论】:

  • 编译器编译代码时不保留内存。 JVM 运行代码时分配内存。

标签: java


【解决方案1】:

Java 标准没有规定,因此您不必担心。

从技术上讲,引用通常与机器的字长一样大,即 32 位机器上的 32 位和 64 位机器上的 64 位,尽管一些 64 位 JVM 使用 special magic 来允许 32 位引用。

【讨论】:

  • @JosiahYoder:在 JRockit JVM 中称为“压缩引用”
【解决方案2】:

堆栈上使用了一个指针的内存价值。除非您的机器处于 64 位模式,否则应该是 32 位(4 字节)。

编辑:

我看到有些人很困惑,认为A对象本身是在堆栈上分配的。在 Java 中情况并非如此:所有对象都在堆上分配(当然是模 JIT 优化)。 A a1; 行只是分配指针 a1,最初设置为 NULL。指针本身在堆栈中,尽管它指向的内容当然会在堆中。稍后对 new A() 的调用将在堆上分配一个 A 对象,该分配的大小确实取决于 A 中的内容。

【讨论】:

    【解决方案3】:

    这取决于平台和实现。对于 32 位平台,无论 A 类的大小如何,都会在对象实例的后台使用 4 字节指针。

    编辑:

    Java 编译器不会为此保留任何内存,这是运行时(准确地说是 JIT)的责任。

    【讨论】:

      【解决方案4】:

      变量引用是堆上对象的句柄,因此它会占用固定的数量(取决于 JVM 实现)。但是,仅针对该行,编译器可能不会占用任何内容,因为该变量尚未初始化。这是由编译器静态检查的,因此它会知道何时需要分配变量,并且实际上可能仅在第一次分配时才分配它。

      如果你有方法:

       public static void method() {
          A a1;
       }
      

      我希望编译器能完全优化它,因为它不能用它做任何事情。

      话虽如此,在 Java 编程中,您不必担心这些事情,它们是由 JVM 实现决定的,Java 不适合字节级内存问题。如果你像这样计算字节数,你应该使用 C 或类似的接近金属的语言。

      【讨论】:

        【解决方案5】:

        您的问题是:Java 中引用占用多少空间?

        如果是这样,我不确定,对不起。

        一个 a1;

        以上所做的只是在执行堆栈上定义一个局部变量,因此没有保留堆内存。

        【讨论】:

          【解决方案6】:

          足以存储对任何 A 的引用! :-)

          请注意,通常不可能确切地知道特定实现将实际用于特定分配的字节数,即使在像 C 这样的低级语言中也是如此: malloc() 本身就是一个显然需要维护内部数据结构的函数。为了避免碎片,它通常分配一个 2^n 大小的内存块。以此类推。

          如果您担心实际使用了多少内存,请编写一个示例程序,并通过您的分析器运行它。

          【讨论】:

            【解决方案7】:

            如前所述,它将使用 32 位或 64 位,但是如果引用仅放在寄存器中,它可能不会使用任何内存。

            【讨论】:

              【解决方案8】:

              引用变量占用的字节数仅取决于 jvm 的架构(64 位为 8 个字节,32 位为 4 个字节

              【讨论】:

                【解决方案9】:

                A a1;在堆栈上分配,而不是在堆上。

                然而,这一切都取决于实现,据我所知并没有真正定义。

                【讨论】:

                  【解决方案10】:

                  即使是堆栈中的内存量,这也取决于 A 中包含/定义的内容。

                  【讨论】:

                  • 所有对象都在堆中分配。从堆栈帧到堆的引用所需的数量仅取决于系统,而不是分配的对象类型。
                  【解决方案11】:

                  null 不占用内存空间。

                  简单地说int 占用一些字节就像float 占用一些内存空间。

                  但是对于null,内存中没有空间被占用。 如果我的回答有误,请发送详细信息。

                  在 Java 中尝试system.memorrysize() 类似的方法。

                  【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2020-10-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-04-03
                  • 1970-01-01
                  • 2013-03-14
                  相关资源
                  最近更新 更多