2012-05-05 77 views
3

可能重複:
In Java, what is the best way to determine the size of an object?如何找到一個對象分配的總內存

如果我們創建一個類中的實例變量和實例方法再怎麼找出的總內存分配給這個類的每個對象,如下所示,例如,我認爲它是一些變量(a,b)大小和方法區域大小(顯示)。這是真的嗎?在課堂上寫的主要方法區域怎麼樣?

例如:

class A { 
    int a; 
    float b; 
    void display() 
    { 
     --- 
    } 

    public static void main(String a[]) 
    { 
     A obj=new A(); 
    } 
} 

回答

8

簡短的回答是,你不需要知道,除非你知道它有問題。

較長答案是,它會使用大約16個字節的對象的標題的4個字節的每個字段(和總的舍入到8字節邊界),即24個字節。

局部變量例如引用分配在堆棧上,通常不計算在內。

你通常不會與大小麻煩的原因是,1 MB是你的時間價值約2秒(比較零售價與最低工資標準內存)。這意味着它把你要問的問題是時間價值遠遠大於存儲器你可能保存(在這種情況下)的值

[A 4 GB模塊花費£18和最低工資是8.50£所以1 GB是值得約0.5小時。 1 MB價值約2秒。]

換句話說,如果一個簡單的變化也救不了你1 MB的內存你有,你可能會浪費你的時間更好地利用。

這同樣適用於移動設備,但程度較輕(內存花費更多,如果它部署到成千上萬的設備節省幾百個字節的總成本能夠決定的事情)

這樣做的後果是,花費的時間你寫long而不是intdouble代替float(他們都有一個額外的字符)可以抵得上數千倍,它使用額外的內存更多。不過我仍然會建議幾乎總是使用double而不是float,而通常使用long而不是int,因爲如果它節省了一個bug,它將超過您必須輸入的額外字符數。


最簡單的方法來測量對象的使用多少空間(或多少內存用於創建對象)之前並且在創建對象之後打開TLAB關閉-XX:-UseTLAB和測量的內存量與Runtime.totalMemory - freeMemory。

不過,我寧願等到一個數據結構,像YourKit探查顯示出來(VisualVM的是免費的)之前,我認爲這是一個問題。

1

可以使用的java.lang。儀器儀表包裝: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/Instrumentation.html

編譯,並把這個類在JAR:

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 

使用getObjectSize()

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

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

調用文件使用java -javaagent:ObjectSizeFetcherAgent.jar C

+1

或者您可以使用內存分析器例如VisualVM告訴你每個對象使用多少。 ;) –

+0

榮譽http://stackoverflow.com/users/5438/stefan-karlsson這個答案http://stackoverflow.com/a/52682/266531 – Kirby