Java中ArrayList的内存大小是多少

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

Obj是变体的,它不像根据Obj以数组中的元素数量那么容易。

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

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

容量与大小不同(always >=) ,但你想让它们相等,调用trimToSize()

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

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

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

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

您可能必须使用像Netbeans中可用的分析器 ,它将向您显示我们程序的内存消耗,并可以为您提供有关每个对象的一些详细信息。

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

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

java的内存使用量取决于JVM实现。 确定我所知道的实例的内存使用情况的唯一真正方法是使用Java 5 检测代理。 有一个小教程可以这样做。

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