2014-12-05 31 views
0

我使用下面的Java項目來確定物體的大小 http://sizeof.sourceforge.net/單位尺寸由java的儀表返回

public class DataClass /*implements Serializable*/{ 

    // private static final long serialVersionUID = 5199373516861766638L; 
    String name = "GUNJ"; 
    String lastName= ""; 

    // int age = 148888890; 

    @Override 
    public String toString() { 
     return "DataClass{" + 
       "Name='" + name + '\'' + 
       ", Last Name='" + lastName + '\'' + 
       ", Age=" + 
       '}'; 

    } 

    public static void main(String[] args) { 

     // SizeOf.skipStaticField(true); 
     // SizeOf.skipFinalField(true); 
     // SizeOf.skipFlyweightObject(true); 

     System.out.println(SizeOf.humanReadable(SizeOf.deepSizeOf(new DataClass()))); //this will print the object size in bytes 
    } 

} 

我得到的結果如下 144KB,64Kb的,72KB

  1. 是' b'代表位或字節?
  2. 爲什麼輸出不會因爲我改變上述情況下的字符數而改變?有時會增加,有時卻不會。

這似乎是使用Java代碼的儀器

好像是用下面的包:java.lang.instrument.Instrumentation

,但不知道包退貨的API的對象是否在大小位或字節。

+0

我會很驚訝,如果它是在位。當你改變「字符數」時,不確定你改變了什麼,但是請記住'String'參考就是這個參考。 – 2014-12-05 13:43:13

+0

這些必須是字節,而不是「Kb」,對吧? – 2014-12-06 19:59:56

回答

0

鏈接你指出指出:

Use the humanReadable() method to get the object size in byte, kilo or mega (if you need giga your in trouble guy!):

所以不是在位爲。

對於你的第二個問題,我沒有答案。我猜String使用的緩衝區的大小大於字符串的大小,所以你可以在緩衝區的大小增加之前添加幾個字符。

1

這個工具看起來有點過時了。作爲替代方案,我可以建議出色的JOL,現在已經在OpenJDK下發布。 它甚至比sizeOf更好,並支持許多很酷的功能。 同時查看Shipilev's blog post,演示如何使用此工具。

0

我不相信你會得到像「144Kb,64Kb,72Kb」這樣的小物體的結果。很有可能你得到了144.0b,64.0b72.0b

page you have linked說已經沒有任何餘地懷疑:

的System.out.println(SizeOf.deepSizeOf()); //如果你懷疑什麼SizeOf.humanReadable不,你可以簡單地忽略它的調用和直接打印的SizeOf.deepSizeOf結果會打印物體的大小以字節爲單位


由於skipStaticFieldskipFinalFieldskipFlyweightObject有三個標誌,從而允許八種組合,但您發佈僅有三個結果沒有告訴你使用的組合,這是很難解釋的結果。尤其是,由於String的實現在Java版本之間進行了更改,並且未指定使用的Java版本。

如果指定了skipFlyweightObject,那麼在您的源代碼中的字面值String就像字面String一樣不計數。如果未指定,但skipFinalField爲,則會計入String的平面物體存儲,但會忽略其char[]內容,因爲它使用final字段進行引用。如果所有的char都被計算在內,你必須考慮到大多數實現都有一個對象大小填充,這可能在報告對象大小時被考慮。

看來,使用Oracle的JVM,每個對象的對象大小都是8個字節的倍數。因此,在char陣列的對象大小增加到八個字節的下一個倍數之前,您最多可以添加四個UTF-16個字符。


您可以使用SizeOf.turnOnDebug();來了解如何計算對象大小。但是您應該始終記住,這樣的累積大小可能包含在不同對象圖之間共享的對象,因此會加起來比實際使用的堆存儲大得多。

還要考慮什麼documentation of Instrumentation.getObjectSize,這是本SizeOf類的後端,說:

返回指定對象使用的存儲量的具體實現的近似。 結果可能包含部分或全部對象的開銷,因此對於實現中的比較而非實現之間的比較是有用的。估計值可能會在單個JVM調用期間發生變化。(由我強調)