我有一个ArrayList<Obj>
,我想知道它使用了多少内存。
Obj
是变体,所以它并不像根据对象的大小乘以数组中的元素数一样容易。
答案 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”列中看到确切消耗的内存大小。