回答
從JVM specification, section 2.4:
Java虛擬機規範並不強制一個具體值編碼爲空。
所以可能是任何東西,但它很可能是一個參考值是全零。引用本身可以是是簡單指針(即,與本機指針相同的虛擬地址,適用於架構的適當大小),但不一定非要。一些JVM具有處理引用的非常聰明的方式 - 例如,Hotspot是able to use 32-bit values for references in many situations, even when running in an x64 process。
」Java虛擬機規範不要求編碼爲null的具體值。「 < - 嗯,在這種情況下,它是如何{de,}序列化? – fge
@fge:這是*內存*表示,它與序列化完全分離。 –
確切的表示形式沒有指定,但我會認爲它只是0x0
就像它是在其他C類似的語言。這是一種特殊的價值,否則不會發生,而不是額外的領域或額外的信息。
注意:當你有一個String
這是一個參考不是一個對象。這個4字節的值可以引用一個對象,或者在null
的情況下是一個不是有效對象的值。
順便說一句:大多數64位JVM使用32位引用,除非堆是32 GB或更多。這在OpenJDK JVM中是可行的,因爲所有對象都是8字節(或16字節)對齊的。由於較低的3或4位始終爲0,因此無需存儲,即可將地址範圍擴展8倍或16倍(典型4 GB範圍)。
@HannesHertach我已經添加了一個解釋爲爲什麼32 GB可以通過32位參考尋址。 「 –
應該爲null本身分配內存,因爲null實際上不是有效的對象實例。它只是一個佔位符,指示對象引用當前不引用對象。
當你做這樣的事情:
字符串str = NULL;
分配的唯一東西是對字符串的引用(這類似於包含指針類型的語言中的字符串指針)。該引用是駐留在堆棧上的32位或64位變量(取決於您的硬件架構和Java版本)(可能取決於聲明的確切上下文)。
什麼是你的概念的參考?只是抽象數字? – Andremoniy
理論上它是一個JVM祕密,實際上它是32位虛擬機上的0(0x00000000)。如果使用Oracle JVM,則可以使用sun.misc.Unsafe(可以在任何地址讀取內存內容)進行驗證。
public class Test {
int i1 = 100;
String s = null;
int i2 = 200;
public static void main(String[] args) throws Exception {
Test test = new Test();
System.out.println(getInt(test, "i1"));
System.out.println(getInt(test, "s"));
System.out.println(getInt(test, "i2"));
}
static int getInt(Test test, String name) throws Exception {
Unsafe u = getUnsafe();
long offset = u.objectFieldOffset(Test.class.getDeclaredField(name));
return u.getInt(test, offset);
}
static Unsafe getUnsafe() throws Exception {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (Unsafe) f.get(null);
}
}
輸出
100
0
200
這隻能證明當試圖讀取一個空引用爲int時,Unsafe(最終)會返回零。並且還要考慮getInt的文檔部分「...但是,如果該變量實際上不是此方法返回的類型,結果是未定義的......」 –
- 1. 空字符串(「」)如何在Java中的內存中存儲?
- 2. bool如何在內存中表示?
- 3. 如何在java中查找非堆空間內存泄漏?
- 4. 如何在內存堆中存在java內部類對象?
- 5. 如何在Java中節省內存?
- 6. 如何釋放內存在Java中
- 7. 如何在Java中釋放內存?
- 8. 你如何在Java中表現爲空?
- 9. 如何在MigraDoc中表示空格
- 10. 如何在listview中顯示空列表?
- 11. 如何在html表中顯示空值?
- 12. 如何在visual C++中表示空格?
- 13. 在虛擬內存中的UIImage表示
- 14. 如何在內存列表中分組?
- 15. 如何在java中非持久地存儲列表的內容
- 16. 我如何在java中顯示我的哈希表的內容
- 17. 在內存中編譯Java
- 18. 在Java 1.6中如何通過HTTPHandler在內存中提供JPEG?
- 19. 在內存中不使用JVM的Java緩存堆空間
- 20. 如何在內存中表示多維數組
- 21. 如何在內存中表示二叉樹
- 22. 如何在內存中表示字符串c
- 23. pascal字符串在內存中如何表示?
- 24. 如何增加java內存空間
- 25. 如果Java程序中存在內存泄漏,它會在任務欄中顯示高內存使用情況
- 26. 如何顯示在Java中
- 27. 事件內部:在.net中事件如何在內部表示?
- 28. 如何使用Java/Scala在內存中保存數據結構
- 29. 如何在Java多線程中共享緩存內存?
- 30. Java:如何在C++中存儲和檢索內存地址
你提到的問題是有點誤導 - 接受的答案是所有關於可空'',不爲空*引用*。 –
檢查這個問題的接受的答案。將幫助你瞭解java中wt是空的.https://stackoverflow.com/questions/2707322/what-is-null-in-java –