亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java-空變量是否需要內存空間

Java-空變量是否需要內存空間

海綿寶寶撒 2019-11-14 09:51:40
class CheckStore {    private String displayText;    private boolean state;    private String meaningfulText;    private URL url;    public CheckStore(String text, boolean state) {        this.displayText = text;        this.state = state;    }    :    :}當我在構造函數中僅初始化兩個變量(displayText和state)時,其余兩個變量(meaningfulText和url將具有value null)是否將需要內存中的空間來存儲null值。Q1。我認為他們將需要空間。如果他們愿意,那么null值將占用多少內存(例如int占用4個字節)。Q2。字符串在內存中占用多少空間。我想這將取決于字符串的長度。那么,一個字符串要占用多少空間,長度又要多少?
查看完整描述

3 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

在Java中,null它只是引用(基本上是受限制的指針)可以具有的值。這意味著引用沒有任何意義。在這種情況下,您仍然會占用參考空間。在32位系統上為4字節,在64位系統上為8字節。但是,在您實際分配該類的實例以將引用指向之前,您不會占用該引用所指向的類的任何空間。

編輯:就String而言,StringJava中的a 每個字符占用16位(2字節),加上少量簿記開銷,這可能是未記錄的且特定于實現的。


查看完整回答
反對 回復 2019-11-14
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

我想補充:

  1. 引用類型的變量將被初始化為空值。

  2. null不是對象。因為(null instanceof Object)等于false

  3. JVM中只有一個空值。無論有多少個變量引用null。

    對象s =(String)null;

    對象i =(整數)null;

    System.out.println(s == i); //真


查看完整回答
反對 回復 2019-11-14
?
三國紛爭

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個字節對齊。)


查看完整回答
反對 回復 2019-11-14
  • 3 回答
  • 0 關注
  • 606 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號