内存分配:在Java中引用占用多少空间?
在Java中,我们编写了一段代码:内存分配:在Java中引用占用多少空间?,java,Java,在Java中,我们编写了一段代码: A a1; a1 = new A(); 编译器编译代码时保留的内存字节数: A a1; A a1;在堆栈而不是堆上分配 然而,据我所知,这一切都取决于实现,实际上并没有定义。这取决于平台和实现。对于32位平台,在对象实例的后台使用4字节指针,而与类a的大小无关 编辑: Java编译器不为此保留任何内存,这是运行时(确切地说,是JIT)的责任。即使是堆栈中的内存量,也取决于A中包含/定义的内容。堆栈上使用了一个指针的内存。这应该是32位(4字节),除非您的机
A a1;
a1 = new A();
编译器编译代码时保留的内存字节数:
A a1;
A a1;在堆栈而不是堆上分配
然而,据我所知,这一切都取决于实现,实际上并没有定义。这取决于平台和实现。对于32位平台,在对象实例的后台使用4字节指针,而与类a的大小无关 编辑:
Java编译器不为此保留任何内存,这是运行时(确切地说,是JIT)的责任。即使是堆栈中的内存量,也取决于A中包含/定义的内容。堆栈上使用了一个指针的内存。这应该是32位(4字节),除非您的机器处于64位模式 编辑:
我看到一些人感到困惑,认为对象本身是在堆栈上分配的。Java中的情况并非如此:所有对象都在堆上分配(当然是模JIT优化)。线
a1代码>只分配指针a1,最初设置为NULL。指针本身在堆栈中,当然它指向的对象也在堆中。稍后对newa()
的调用将在堆上分配一个A对象,分配的大小取决于A中的内容。是您的问题:在Java中引用占用多少空间
如果是这样的话,我不确定,对不起
A a1
以上所做的只是在执行堆栈上定义一个局部变量,这样就不会保留堆内存。这不是Java标准所指定的,因此您不必担心它
从技术上讲,引用通常与机器的字大小一样大,即32位机器上为32位,64位机器上为64位,尽管有些64位JVM使用32位引用。变量引用是堆上对象的句柄,因此它将占用固定数量(取决于JVM实现)。但是,仅针对该行,编译器可能不会处理任何内容,因为变量尚未初始化。这是由编译器静态检查的,因此它将知道何时需要分配变量,并且实际上可能仅在首次分配变量时才分配它
如果您有一个方法:
public static void method() {
A a1;
}
我希望编译器能够完全优化它,因为它不能用它做任何事情
尽管如此,在Java编程中,您不必担心这些事情,它们是由JVM实现决定的,Java不适合字节级内存。如果这样计算字节,应该使用C或类似的金属语言。足够存储对任何a!的引用:-)
请注意,通常不可能确切地知道特定实现将为特定分配实际使用多少字节,即使在像C:malloc()这样的低级语言中,它本身显然是一个需要维护内部数据结构的函数。为了避免碎片,它通常分配一个2^n大小的内存块。等等
如果您关心实际使用了多少内存,请编写一个示例程序,并通过探查器运行它。null
不会占用内存中的任何空间
简单地说int
会占用一些字节,比如float
会占用一些内存空间
但是对于null
而言,内存中没有空间被占用。
如果我的回答错了,请给我详细信息
在Java中尝试类似system.MemorySize()的方法。如前所述,它将使用32位或64位,但是如果引用仅放在寄存器中,它可能不会使用任何内存。引用变量占用的字节数完全依赖于jvm的体系结构(8字节代表64位,4字节代表32位所有对象都在堆中分配。从堆栈帧到堆的引用所需的量仅取决于系统,而不是所分配的对象类型。编译器编译代码时不保留内存。JVM运行代码时分配内存。@JosiahYoder:调用它JRockit JVM中的“压缩引用”请参见