JAVA中类的引用大小

JAVA中类的引用大小,java,class,reference,size,Java,Class,Reference,Size,Java中类的引用大小是多少?对于特定的JVM和操作系统,无论引用的是哪个类,它都是常量 无论a、b和c类的大小如何,a、b和c类的大小是否相同?引用基本上是一个内存地址(是的,我知道它比Java中的略大),它的大小与它指向的对象的大小无关。唯一的差异是,如果您使用的是64位JVM,则引用需要更大以容纳更大的内存地址。我认为没有明确指定它;它可能由JVM的实现来决定(就像System.identityHashcode())。当然,这本书似乎没有提到任何具体的尺寸 几乎可以肯定的是,引用实际上

Java中类的引用大小是多少?对于特定的JVM和操作系统,无论引用的是哪个类,它都是常量




无论
a
b
c
类的大小如何,
a
b
c
类的大小是否相同?

引用基本上是一个内存地址(是的,我知道它比Java中的略大),它的大小与它指向的对象的大小无关。唯一的差异是,如果您使用的是64位JVM,则引用需要更大以容纳更大的内存地址。

我认为没有明确指定它;它可能由JVM的实现来决定(就像
System.identityHashcode()
)。当然,这本书似乎没有提到任何具体的尺寸

几乎可以肯定的是,引用实际上是指向内存地址的指针,但您不应该依赖于它的任何特定行为。特别是,您根本不应该像在C中那样操纵它们


我很好奇你问这个问题的目的是什么——这仅仅是好奇还是你计划以某种方式利用参考尺寸(这几乎肯定是个坏主意)?如果是后者,请告诉我们您计划做什么,因为可能有更好的方法来实现它。

是的,所有引用都是指向对象的“指针”或指向对象的间接“指针”。它们的实际内存大小是JVM的一个实现细节,但您可以确保它们对于不同的类大小相同。

就字节码而言,引用的行为与
int
float
非常相似
long
double
占用两个堆栈插槽。这就好像引用是四个字节。然而,64位系统经常使用这个命令,以便可以使用64位指针

一些JVM(我相信BEA JRockit已经有一段时间了,最近加入到Sun中)使用“压缩oops”,它是32位的,可以左移几位,以便在64位系统上访问数十GB的内存。在减少内存消耗的同时,减少引用大小还可以减少CPU内存带宽和缓存需求,从而提高性能,尽管需要进行额外的调整


我相信Azul版本的Hotspot使用64位引用,48位用于地址和16位类型信息。

@dtsazza:在某些虚拟机中,您只需将索引放入指针数组中即可。这允许GC快速重新定位对象地址(它只需要在压缩运行后更新表)。我以为rsp是在从用户的角度讨论二阶指针的存在。那将是。。。有趣。
Class A
Class B
Class C
A a;
B b;
C c;