[英]What is the memory size of an ArrayList in Java
我有一个ArrayList<Obj>
,我想知道它正在使用多少内存。
Obj
是变体,因此,它不像将一个对象的大小乘以数组中的元素数那么容易。
它是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。 这并不意味着它是唯一的解决方案,只是我的最爱。
答案是,这取决于您如何衡量。 如果您问我ArrayList的大小,我会给您一些浅的大小。 也就是说,ArrayList由引用数组和指示所包含元素数的整数组成。 如果您想知道大小,则只需4 + * array.length。
如果您想知道ArrayList的大小以及所有包含的元素,那么可以使用一些堆分析器来解决。 我相信YourKit是其中之一。
ArrayList的工作方式是只包含一个特定大小的数组(可以在构造函数中指定,我相信默认值为10)。 每当内部数组的元素数量太大时,内部数组的大小就会加倍。 因此,您需要将对象的大小乘以内部数组的大小。
资料来源: 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.