Java中某個類的引用大小是多少?對於特定的JVM和OS而言,它是不變的,而不管引用的類是什麼。JAVA中某個類的引用大小
Class A
Class B
Class C
A a;
B b;
C c;
是a
,b
和c
的A
,B
和C
類的大小相同,不論大小?
Java中某個類的引用大小是多少?對於特定的JVM和OS而言,它是不變的,而不管引用的類是什麼。JAVA中某個類的引用大小
Class A
Class B
Class C
A a;
B b;
C c;
是a
,b
和c
的A
,B
和C
類的大小相同,不論大小?
是的,所有引用都是對象的「指針」,或者是指向對象的間接「指針指針」。它們的實際內存大小是JVM的實現細節,但您可以確定它們在不同類中的大小相同。
該引用基本上是一個內存地址(是的,我知道它比Java中的要多一點),它的大小與它指向的對象的大小無關。唯一的差異是,如果您使用的是64位JVM,則引用需要更大以容納更大的內存地址。
我不相信它是明確指定的;它可能留給執行JVM來決定(就像System.identityHashcode()
)。 relevant section of the JLS當然似乎沒有提及任何具體的大小。
幾乎可以肯定的是,refernce實際上是一個指向內存地址的指針,但不應該依賴於它的任何特定行爲。特別是,你不應該像在C中那樣嘗試操縱它們。
我很好奇你對此提出的問題 - 僅僅是好奇還是你打算利用參考大小(這肯定會是一個壞主意)?如果是後者,那麼讓我們知道你打算做什麼,因爲可能有更好的方法來實現它。
就字節碼而言,引用的行爲與int
或float
的行爲大致相同。 long
和double
佔用兩個堆棧槽。所以就好像引用是四個字節。但是,64位系統通常會採用這種方式,以便可以使用64位指針。一些JVM(我相信BEA JRockit已經有一段時間了,最近又添加到了Sun的系統中)使用32位的「壓縮oops」,這個32位數據向左移動了幾個位置,以便在64位系統上訪問數十GB的內存。除了減少內存消耗外,減少參考大小還可以減少CPU內存帶寬和緩存需求,儘管有額外的擺弄,但仍可提高性能。
我相信Azul的Hotspot版本使用64位引用,48位地址和16位類型信息。
「指針指針」?在什麼情況下? – 2009-11-12 11:34:55
@dtsazza:在一些虛擬機中,您只需將索引獲取到指針數組中。這允許GC快速重定位對象地址(它只需在壓縮運行後更新表)。 – 2009-11-12 11:41:03
啊,我明白了 - 我沒有從幕後的角度思考。我認爲rsp是從用戶的角度談論二階指針的存在。這將是...有趣的。 – 2009-11-12 11:49:18