繁体   English   中英

Java中ArrayList的内存大小是多少

[英]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。 这并不意味着它是唯一的解决方案,只是我的最爱。

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

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

如果您想知道ArrayList的大小以及所有包含的元素,那么可以使用一些堆分析器来解决。 我相信YourKit是其中之一。

java的内存使用情况取决于JVM的实现。 确定我知道的实例的内存使用情况的唯一真正方法是使用Java 5 工具代理。 有一些教程可以做到这一点。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM