2009-11-12 34 views
2

Java中某个类的引用大小是多少?对于特定的JVM和OS而言,它是不变的,而不管引用的类是什么。JAVA中某个类的引用大小


Class A 
Class B 
Class C 

A a; 
B b; 
C c; 

abcABC类的大小相同,不论大小?

回答

3

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

+1

“指针指针”?在什么情况下? – 2009-11-12 11:34:55

+0

@dtsazza:在一些虚拟机中,您只需将索引获取到指针数组中。这允许GC快速重定位对象地址(它只需在压缩运行后更新表)。 – 2009-11-12 11:41:03

+0

啊,我明白了 - 我没有从幕后的角度思考。我认为rsp是从用户的角度谈论二阶指针的存在。这将是...有趣的。 – 2009-11-12 11:49:18

2

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

3

我不相信它是明确指定的;它可能留给执行JVM来决定(就像System.identityHashcode())。 relevant section of the JLS当然似乎没有提及任何具体的大小。

几乎可以肯定的是,refernce实际上是一个指向内存地址的指针,但不应该依赖于它的任何特定行为。特别是,你不应该像在C中那样尝试操纵它们。

我很好奇你对此提出的问题 - 仅仅是好奇还是你打算利用参考大小(这肯定会是一个坏主意)?如果是后者,那么让我们知道你打算做什么,因为可能有更好的方法来实现它。

1

就字节码而言,引用的行为与intfloat的行为大致相同。 longdouble占用两个堆栈槽。所以就好像引用是四个字节。但是,64位系统通常会采用这种方式,以便可以使用64位指针。一些JVM(我相信BEA JRockit已经有一段时间了,最​​近又添加到了Sun的系统中)使用32位的“压缩oops”,这个32位数据向左移动了几个位置,以便在64位系统上访问数十GB的内存。除了减少内存消耗外,减少参考大小还可以减少CPU内存带宽和缓存需求,尽管有额外的摆弄,但仍可提高性能。

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