Java中ArrayList的内存大小是多少

时间:2011-01-19 19:49:31

标签: java memory size arraylist

我有一个ArrayList<Obj>,我想知道它使用了多少内存。

Obj是变体,所以它并不像根据对象的大小乘以数组中的元素数一样容易。

10 个答案:

答案 0 :(得分:21)

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

容量与大小不同(always >=),但您想让它们相等,请致电trimToSize()

从技术上讲,ArrayList有一个Object[]存储数据。

答案 1 :(得分:5)

您可以使用类似Runtime.getRuntime().totalMemory()及其对应Runtime.getRuntime().freeMemory()的内容来获得有根据的猜测,但这并不能解释调用之间GC的对象。

答案 2 :(得分:4)

这就是内存分析器的用途。它将告诉您的平台。空ArrayList的最小大小为64字节。除非你有100K或更多元素,否则你很可能不需要知道这一点。

答案 3 :(得分:3)

如果您知道对象的内容分布,则可以强制计算它。

但是,我能想到的最精确的方法是在分析器中查看它。有免费工具,其中一些随JDK一起提供。但是,我使用的最好的工具是Yourkit。这并不意味着它是唯一的解决方案,只是我的最爱。

答案 4 :(得分:3)

您可能必须使用类似Netbeans中可用的profiler来显示我们程序的内存消耗,并且可以为您提供有关每个对象的一些详细信息。

答案 5 :(得分:1)

答案是,这取决于你的测量方式。如果你问我ArrayList的大小,我会给你浅的大小。也就是说,ArrayList由一个引用数组和一个表示所包含元素数的整数组成。如果你想知道它的大小,它只是4 + * array.length。

如果你想知道ArrayList的大小和所有包含的元素,那么有一些堆分析器可以解决这个问题。我相信YourKit就是其中之一。

答案 6 :(得分:1)

java的内存使用量取决于JVM实现。确定我所知道的实例的内存使用情况的唯一真正方法是使用Java 5 instrumentation代理。有一点tutorial这样做。

答案 7 :(得分:0)

ArrayList的工作方式是它只包含一个特定大小的数组(可以在构造函数中指定,我相信10是默认值?)。每当内部数组的元素数量变得太大时,内部数组的大小就会翻倍。因此,您需要将对象的大小乘以内部数组的大小。

答案 8 :(得分:0)

来源:http://uttesh.blogspot.com/2015/04/get-byte-or-memory-size-of.html

com.android.chrome.browser.ChromeTabbedActivity

答案 9 :(得分:0)

在 ArrayList 中添加和删除元素后进行堆转储。使用任何堆分析器。 (Eclipse MAT 我更喜欢) 您可能会看到为已删除项目放置了空值。这使得 ArrayList 将内存保存在堆中,即使只有几个元素或没有元素。您可以在“Retained Heap”列中看到确切消耗的内存大小。