内存分配:Java中引用占用了多少空间?

时间:2009-08-28 16:10:39

标签: java

在Java中,我们编写了一个代码:

A a1;
a1 = new A();

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

A a1;

11 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:11)

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

编辑:

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

答案 2 :(得分:4)

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

编辑:

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

答案 3 :(得分:4)

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

如果您有方法:

 public static void method() {
    A a1;
 }

我希望编译器能够完全优化它,因为它无法对它做任何事情。

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

答案 4 :(得分:2)

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

如果是这种情况我不确定,抱歉。

A a1;

以上所做的就是在执行堆栈上定义一个局部变量,这样就不会保留堆内存。

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

引用变量占用的字节仅依赖于jvm的结构(64位为8字节,32位为4位

答案 8 :(得分:-1)

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

然而,这完全取决于实现,据我所知,实际上并未定义。

答案 9 :(得分:-1)

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

答案 10 :(得分:-2)

null不会占用内存中的任何空间。

简单地说int占用像float这样的字节会占用内存中的一些空间。

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

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