2011-01-19 69 views
5

我有一個ArrayList<Obj>,我想知道它使用了多少內存。Java中ArrayList的內存大小是多少

Obj是變體,所以它不像在一個對象的大小中乘數組中元素的數量那麼簡單。

+3

請參閱http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object – 2011-01-19 19:54:59

回答

3

如果你知道對象的內容分佈,你可以蠻力計算它。

但是,我能想到的最精確的方法是在剖析器中查看它。這裏有免費的工具,有些是JDK提供的。不過,我用過的最好的工具是Yourkit。這並不意味着它是唯一的解決方案,只是我的最愛。

+0

jmap足夠好而且免費:) – bestsss 2011-01-19 19:54:03

18

這是java.util.ArrayList乘以參考大小(4 bytes on 32bit, 8bytes on 64bit) + [Object header + one int and one references]的容量。

的容量比大小不同(always >=)但你想「時間相等,稱之爲trimToSize()

技術上來說ArrayListObject[]它存儲的數據。

3

這是一個內存分析器的用途。它會告訴你你的平臺。空ArrayList的最小大小是64字節。很有可能你不需要知道這些,除非你有100K或更多的元素。

0

ArrayList的工作方式是它只包含一個特定大小的數組(可以在構造函數中指定,我相信10是默認值?)。只要內部數組的元素數量過大,內部數組的大小就會增加一倍。所以你需要將對象的大小乘以內部數組的大小。

3

您可能需要使用Netbeans中可用的profiler,它會告訴您我們程序的內存消耗,並且可以爲您提供有關每個對象的一些詳細信息。

1

答案是,這取決於你如何衡量。如果你問我ArrayList的大小,我會給你淺的大小。也就是說,一個ArrayList由一個引用數組和一個指示包含元素數的整數組成。如果你想知道它的大小,那簡直就是4 + * array.length。

如果你想知道ArrayList的大小和所有包含的元素,那麼有一些堆分析器可以解決這個問題。我相信YourKit就是其中之一。

1

java的內存使用情況取決於JVM實現。確定我知道的實例的內存使用情況的唯一真正方法是使用Java代理。有一點tutorial這樣做。

相關問題