3 回答
TA貢獻1772條經驗 獲得超6個贊
在Java中,null它只是引用(基本上是受限制的指針)可以具有的值。這意味著引用沒有任何意義。在這種情況下,您仍然會占用參考空間。在32位系統上為4字節,在64位系統上為8字節。但是,在您實際分配該類的實例以將引用指向之前,您不會占用該引用所指向的類的任何空間。
編輯:就String而言,StringJava中的a 每個字符占用16位(2字節),加上少量簿記開銷,這可能是未記錄的且特定于實現的。
TA貢獻1875條經驗 獲得超3個贊
我想補充:
引用類型的變量將被初始化為空值。
null不是對象。因為(null instanceof Object)等于false
JVM中只有一個空值。無論有多少個變量引用null。
對象s =(String)null;
對象i =(整數)null;
System.out.println(s == i); //真
TA貢獻1804條經驗 獲得超7個贊
您可以使用jol來獲取該類的布局。(但是要小心,您可能需要更深入地了解其背后的機制,不要盲目相信結果,并且要知道這只是當前使用的VM的估算值(在我的案例中為1.7.0_76 x64 win):):
我使用CLI版本,我猜正確的方法是將庫包含在您的項目中,但是無論如何,它似乎可以這樣工作:
test>java -cp target\classes;jol-cli-0.3.1-full.jar org.openjdk.jol.Main internals test.CheckStore
Running 64-bit HotSpot VM.
Using compressed oop with 0-bit shift.
Using compressed klass with 0-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
VM fails to invoke the default constructor, falling back to class-only introspection.
test.CheckStore object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 1 boolean CheckStore.state N/A
13 3 (alignment/padding gap) N/A
16 4 String CheckStore.displayText N/A
20 4 String CheckStore.meaningfulText N/A
24 4 URL CheckStore.url N/A
28 4 (loss due to the next object alignment)
Instance size: 32 bytes (estimated, the sample instance is not available)
Space losses: 3 bytes internal + 4 bytes external = 7 bytes total
與自動壓縮的oops相同:
test>java -XX:-UseCompressedOops -cp target\classes;jol-cli-0.3.1-full.jar org.openjdk.jol.Main internals test.CheckStore
Running 64-bit HotSpot VM.
Objects are 8 bytes aligned.
Field sizes by type: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
VM fails to invoke the default constructor, falling back to class-only introspection.
test.CheckStore object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 16 (object header) N/A
16 1 boolean CheckStore.state N/A
17 7 (alignment/padding gap) N/A
24 8 String CheckStore.displayText N/A
32 8 String CheckStore.meaningfulText N/A
40 8 URL CheckStore.url N/A
Instance size: 48 bytes (estimated, the sample instance is not available)
Space losses: 7 bytes internal + 0 bytes external = 7 bytes total
如果您的字段為null,那么這些只是對象本身的布局,那么它將不會指向更多對象,否則您還必須查看目標類型(URL和String)。(并且,如果您擁有所有這些實例的多個實例,則取決于您使用相同的多次還是不同的實例)。空字段不能在內存中跳過,因為分配實例時需要調整實例的大小。所以這些字段都是預先構造的,它們只是不引用堆上其他地方分配的對象。
注意:如果實現默認的構造函數,則會獲得更多詳細信息,但是在這種情況下的大小將是相同的。如果您想知道字段的順序和填充的來源,可以查看這篇文章 -(基本上,它將對象對齊8個字節,按大小對字段進行排序,將相同類型分組在一起,最后引用。來自超級類型的字段排在最前面, 4個字節對齊。)
添加回答
舉報
