【发布时间】:2011-01-19 19:49:31
【问题描述】:
我有一个ArrayList<Obj>,我想知道它使用了多少内存。
Obj 是变体,所以它不像数组中元素的数量乘以对象的大小那么容易。
【问题讨论】:
标签: java memory size arraylist
我有一个ArrayList<Obj>,我想知道它使用了多少内存。
Obj 是变体,所以它不像数组中元素的数量乘以对象的大小那么容易。
【问题讨论】:
标签: java memory size arraylist
它是 java.util.ArrayList 的容量乘以引用大小(4 bytes on 32bit, 8bytes on 64bit) + [Object header + one int and one references]。
容量与大小不同(always >=),但您想让它们相等,请致电trimToSize()
从技术上讲,ArrayList 有一个 Object[] 用于存储数据。
【讨论】:
您可以使用 Runtime.getRuntime().totalMemory() 及其对应的 Runtime.getRuntime().freeMemory() 之类的东西来获得有根据的猜测,但这并不能说明在调用之间被 GC 处理的对象。
【讨论】:
这就是内存分析器的用途。它会告诉你你的平台。空 ArrayList 的最小大小为 64 字节。除非您有 100K 或更多元素,否则您很可能不需要知道这一点。
【讨论】:
如果你知道对象的内容分布,你可以蛮力计算它。
但是,我能想到的最精确的方法是在分析器中查看它。那里有免费工具,其中一些随 JDK 一起提供。但是,我用过的最好的工具是 Yourkit。这并不意味着它是唯一的解决方案,只是我最喜欢的解决方案。
【讨论】:
您可能必须使用profiler,就像 Netbeans 中可用的那样,它将向您显示我们程序的内存消耗,并可以为您提供有关每个对象的一些详细信息。
【讨论】:
来源:http://uttesh.blogspot.com/2015/04/get-byte-or-memory-size-of.html
public static long getBytesFromList(List list) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(list);
out.close();
return baos.toByteArray().length;
}
【讨论】:
答案是,这取决于您如何衡量。如果你问我 ArrayList 的大小,我会给你浅的大小。也就是说,一个 ArrayList 由一个引用数组和一个表示包含元素个数的整数组成。如果您想知道大小,只需 4 + *array.length。
如果你想知道 ArrayList 的大小和所有包含的元素,那么有一些堆分析器可以解决这个问题。我相信 YourKit 就是其中之一。
【讨论】:
java 的内存使用取决于 JVM 的实现。我知道的唯一确定实例内存使用情况的真正方法是使用 Java 5 instrumentation 代理。有一点tutorial可以这样做。
【讨论】:
ArrayList 的工作方式是它简单地包含一个特定大小的数组(可以在构造函数中指定,我相信 10 是默认值?)。每当内部数组的元素数量变得太大时,内部数组的大小就会加倍。所以你需要将对象的大小乘以内部数组的大小。
【讨论】:
在从 ArrayList 添加和删除元素后进行堆转储。使用任何堆分析器。 (我更喜欢Eclipse MAT) 您可能会看到为已删除项目放置的空值。即使只有少数元素或没有元素,这也使得 ArrayList 将内存保存在堆中。您可以在“保留堆”列中查看确切消耗的内存大小。
【讨论】: