2014-01-07 76 views
3

我和我的計算機科學老師討論了JAVA中一個類佔用多少內存。我們都不知道具體的答案,但我有幾個他無法回答的問題。如何確定我的類使用了多少內存?

1)是否像每個類的原始數據類型使用的字節數量是什麼決定其內存使用一樣簡單?

2)如果您創建了一個類的實例並將其設置爲null,它是否仍佔用與非空實例相同數量的字節?

3)一個包含100個字符的字符串是否與單個字符串具有相同的字節數量?

4)如果一個類沒有變量,沒有方法,沒有什麼,只是看起來是這樣的:

public class Test{} 

將它仍然佔用內存?

+0

根據定義,實例不爲null。變量可以存儲'null'引用,但實例是實際的對象。 –

+0

我認爲vm有空間可以決定,但我認爲每個變量都有一個引用的大小(或者對某些原語來說可能更少),而對象的引用點(它大約是其基元的大小加上vtables等支持OOP)。通過該邏輯1)否2)否3)多一點點4)是參考 – user3125280

+1

閱讀['Thinking in Java']中的第42-43頁(http://pervasive2.morselli.unimo.it/~nicola/課程/ IngegneriaDelSoftware/java/ThinkingInJava.pdf)來了解存儲信息的位置。如果你的老師確實無法回答這些問題,他/他沒有商業教學Java。 –

回答

1

在兩種不同的事情之間混淆不清:class需要的內存量(元數據或實例的「藍圖」)和instance需要的內存量(數據/對象)。

對於類,您可以使用java.lang.instrument.Instrument.getObjectSize(yourObject.getClass());,對於一個實例 - 它不一定具有固定的大小。例如,如果您有一個Person的實例並且它有一個name字段 - 則不同的名稱將根據字符串的長度捕獲不同的空間。

您可以使用分析器來查看有多少內存實例需要使用,YourKit是一個出色的分析器,但它不是免費的。

0

使用此:java.lang.instrument package

編譯庫,並在您的罐子。 然後:

import java.lang.instrument.Instrumentation; 

public class ObjectSizeFetcher { 
    private static Instrumentation instrumentation; 

    public static void premain(String args, Instrumentation inst) { 
     instrumentation = inst; 
    } 

    public static long getObjectSize(Object o) { 
     return instrumentation.getObjectSize(o); 
    } 
} 

MANIFEST.MF中添加:

Premain-Class: ObjectSizeFetcher 

現在做:

java -javaagent:ObjectSizeFetcherAgent.jar C 

來源:In Java, what is the best way to determine the size of an object?

public class C { 
    private int x; 
    private int y; 

    public static void main(String [] args) { 
     System.out.println(ObjectSizeFetcher.getObjectSize(new Test())); 
    } 
} 

你可以調用你的代碼

0

你可以在這裏使用的技術測量尺寸:

https://stackoverflow.com/a/383597/3049628

除此之外,你通常可以猜到的內存粗糙量(大部分情況要麼是4個字節或8取決於一個32位或64位系統。數組打包得更好。)但實際的實現依賴於JVM,因此沒有固定的規則。

相關問題