在Java中,我们编写了一个代码:
A a1;
a1 = new A();
编译器编译代码时保留了多少字节的内存:
A a1;
答案 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()
类似的方法。