爲什麼java中的引用類型需要8個字節?爲什麼不少於或多於8個字節?java中的引用類型大小
回答
這是因爲引用變量實際上並不包含對象。這是達到目標的一種方式。 JVM管理這種方式是我們最不關心的事情。您可以將其視爲堆中對象位置的地址。但它不必像地址那樣直截了當。
8 Bytes是Java中Long變量的大小,允許引用1.01457092×10^19個引用,這對大多數應用程序來說應該足夠了,並且比大多數硬盤驅動器可以解決的問題要大,因爲考慮到每個引用點需要還擁有數據...
編輯: 看了我想澄清的是,引用只是一個指針數據其他答案之一,不包含數據,在Java架構師決定使用64位值來表示引用,因爲它給你一個巨大的地址空間。
類型引用的值可以被認爲是指向對象的指針。 8字節應該在堆中處理。
其實,這是行不通指定的參考變量應該有多少個字節有,事實上,它不是到處都一樣。
用於32位系統(即內存總線中具有32位地址的系統)的通用虛擬機通常使用32位(= 4字節,與int
和float
相同)作爲對象引用的大小,而虛擬機對於64位系統,通常使用64位本地地址(= 8字節)。 (請注意,大多數64位系統也可以運行32位程序,因此即使在那裏您也會使用32位虛擬機。)
這只是簡化實現的問題,如果您可以使用實際的內存地址爲您的引用,而不是別的。
因爲這增加了使用的內存大小(通常,我們實際上並不需要訪問是的內存),from Java 7 on 64位HotSpot虛擬機將能夠使用在一定條件下的32位參考,即當堆小於32 GB時(8·2 字節)。要將它們轉換爲實際的內存地址,它們會乘以8(因爲對象將在8字節邊界上對齊),然後添加到基址(如果不爲零)。 (對於小於4 GB的堆,我們不需要乘法步驟。)
其他虛擬機可能使用類似的技巧。
讓我舉個例子,以幫助您更好地瞭解
String myName = new String("John");
String yourName = new String("John");
if (myName == yourName)
{
System.out.println("Refereces point to Same objects on heap");
} else
{
System.out.println("Refereces point to different objects on heap");
}
和輸出Refereces指向不同的對象上堆。
這裏MYNAME和YOURNAME是兩個引用其指向類型字符串(上堆分配存儲器)的對象。註釋參考變量的內存分配在堆棧上,而不是在堆上。兩個引用變量都只有位於堆上的String對象的地址(或類似的唯一抽象)。地址的大小對於特定的操作系統體系結構將保持不變。在32位的情況下,它將是4個字節,而對於64位,它將是8個字節。
所以指出的對象的大小是尊敬變量可能會改變,但引用的大小保持不變,因爲它們只是攜帶對任何特定體系結構保持不變的地址。
- 1. JAVA中某個類的引用大小
- 2. LLVM中的類型大小
- 3. 對象,數組和基元類型的Java和精確引用大小
- 4. C# - 類型大小
- 5. 如何在JAVA中查找通用數據類型大小?
- 6. 的Java:如何以小博大的嵌套泛型類型
- 7. 原子類型的大小
- 8. Java Swing中的小型大寫字母?
- 9. PermGen空間中的Java類的大小
- 10. 通用類型自引用類型的Java子類問題
- 11. 減少數據類型大小會導致索引超過最大大小?
- 12. 如何在Java中知道用戶定義類型(類)的大小?
- 13. Ada中陣列類型的大小
- 14. stdint.h中的C++標準類型大小
- 15. Java泛型 - 超類型引用
- 16. 大型表上的SQL索引:一些大型索引或更小的索引?
- 17. java中的縮小類型轉換
- 18. 引用類型.NET中的值類型
- 19. 引用變量的數據類型(Java)
- 20. 的Java種類型和空引用
- 21. Java引用類型的參數
- 22. 大小類型字符串
- 23. 泛型的類引用自己作爲Java中泛型的類型
- 24. 檢查泛型中的引用類型java
- 25. 引用.net中的引用類型?
- 26. .NET中的引用類型
- 27. javascript中的引用類型
- 28. EMF中的引用類型
- 29. Java中的註釋爲什麼創建類類型引用?
- 30. Java中的基元包裝類作爲引用類型處理?
事實上,它可能不能,因爲GC在物理內存中移動對象很多,所以JVM需要額外的間接級來保持引用是最新的。 – 2011-03-18 11:06:12