【问题标题】:What is the memory size of an ArrayList in JavaJava中ArrayList的内存大小是多少
【发布时间】:2011-01-19 19:49:31
【问题描述】:

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

Obj 是变体,所以它不像数组中元素的数量乘以对象的大小那么容易。

【问题讨论】:

标签: java memory size arraylist


【解决方案1】:

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

容量与大小不同(always >=),但您想让它们相等,请致电trimToSize()

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

【讨论】:

  • 你能引用这个吗?
【解决方案2】:

您可以使用 Runtime.getRuntime().totalMemory() 及其对应的 Runtime.getRuntime().freeMemory() 之类的东西来获得有根据的猜测,但这并不能说明在调用之间被 GC 处理的对象。

【讨论】:

  • 谢谢。好的,它不是 100% 精确,但很容易实现。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果你知道对象的内容分布,你可以蛮力计算它。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        来源: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;
        }
        

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                在从 ArrayList 添加和删除元素后进行堆转储。使用任何堆分析器。 (我更喜欢Eclipse MAT) 您可能会看到为已删除项目放置的空值。即使只有少数元素或没有元素,这也使得 ArrayList 将内存保存在堆中。您可以在“保留堆”列中查看确切消耗的内存大小。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-05-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-11-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多