【发布时间】:2009-08-28 16:10:39
【问题描述】:
我们用Java写了一段代码:
A a1;
a1 = new A();
编译器编译代码时保留多少字节内存:
A a1;
【问题讨论】:
-
编译器编译代码时不保留内存。 JVM 运行代码时分配内存。
标签: java
我们用Java写了一段代码:
A a1;
a1 = new A();
编译器编译代码时保留多少字节内存:
A a1;
【问题讨论】:
标签: java
Java 标准没有规定,因此您不必担心。
从技术上讲,引用通常与机器的字长一样大,即 32 位机器上的 32 位和 64 位机器上的 64 位,尽管一些 64 位 JVM 使用 special magic 来允许 32 位引用。
【讨论】:
堆栈上使用了一个指针的内存价值。除非您的机器处于 64 位模式,否则应该是 32 位(4 字节)。
编辑:
我看到有些人很困惑,认为A对象本身是在堆栈上分配的。在 Java 中情况并非如此:所有对象都在堆上分配(当然是模 JIT 优化)。 A a1; 行只是分配指针 a1,最初设置为 NULL。指针本身在堆栈中,尽管它指向的内容当然会在堆中。稍后对 new A() 的调用将在堆上分配一个 A 对象,该分配的大小确实取决于 A 中的内容。
【讨论】:
这取决于平台和实现。对于 32 位平台,无论 A 类的大小如何,都会在对象实例的后台使用 4 字节指针。
编辑:
Java 编译器不会为此保留任何内存,这是运行时(准确地说是 JIT)的责任。
【讨论】:
变量引用是堆上对象的句柄,因此它会占用固定的数量(取决于 JVM 实现)。但是,仅针对该行,编译器可能不会占用任何内容,因为该变量尚未初始化。这是由编译器静态检查的,因此它会知道何时需要分配变量,并且实际上可能仅在第一次分配时才分配它。
如果你有方法:
public static void method() {
A a1;
}
我希望编译器能完全优化它,因为它不能用它做任何事情。
话虽如此,在 Java 编程中,您不必担心这些事情,它们是由 JVM 实现决定的,Java 不适合字节级内存问题。如果你像这样计算字节数,你应该使用 C 或类似的接近金属的语言。
【讨论】:
您的问题是:Java 中引用占用多少空间?
如果是这样,我不确定,对不起。
一个 a1;
以上所做的只是在执行堆栈上定义一个局部变量,因此没有保留堆内存。
【讨论】:
足以存储对任何 A 的引用! :-)
请注意,通常不可能确切地知道特定实现将实际用于特定分配的字节数,即使在像 C 这样的低级语言中也是如此: malloc() 本身就是一个显然需要维护内部数据结构的函数。为了避免碎片,它通常分配一个 2^n 大小的内存块。以此类推。
如果您担心实际使用了多少内存,请编写一个示例程序,并通过您的分析器运行它。
【讨论】:
如前所述,它将使用 32 位或 64 位,但是如果引用仅放在寄存器中,它可能不会使用任何内存。
【讨论】:
引用变量占用的字节数仅取决于 jvm 的架构(64 位为 8 个字节,32 位为 4 个字节
【讨论】:
A a1;在堆栈上分配,而不是在堆上。
然而,这一切都取决于实现,据我所知并没有真正定义。
【讨论】:
即使是堆栈中的内存量,这也取决于 A 中包含/定义的内容。
【讨论】:
null 不占用内存空间。
简单地说int 占用一些字节就像float 占用一些内存空间。
但是对于null,内存中没有空间被占用。
如果我的回答有误,请发送详细信息。
在 Java 中尝试system.memorrysize() 类似的方法。
【讨论】: