Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存分配:在Java中引用占用多少空间?_Java - Fatal编程技术网

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

内存分配:在Java中引用占用多少空间?,java,Java,在Java中,我们编写了一段代码: A a1; a1 = new A(); 编译器编译代码时保留的内存字节数: A a1; A a1;在堆栈而不是堆上分配 然而,据我所知,这一切都取决于实现,实际上并没有定义。这取决于平台和实现。对于32位平台,在对象实例的后台使用4字节指针,而与类a的大小无关 编辑: Java编译器不为此保留任何内存,这是运行时(确切地说,是JIT)的责任。即使是堆栈中的内存量,也取决于A中包含/定义的内容。堆栈上使用了一个指针的内存。这应该是32位(4字节),除非您的机

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

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中的“压缩引用”请参见