Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取内存中集合的大小?_Java - Fatal编程技术网

Java 如何获取内存中集合的大小?

Java 如何获取内存中集合的大小?,java,Java,我有一个存储压缩数据的自定义集合 如何轻松获取集合的大小(KB或MB) 我想看看我的数据存储的效率,以及压缩对某些数据的影响。也许最简单的方法是计算添加或删除收藏中的项目时所消耗的内存量(对象大小),此时您可能需要计算放入收藏中的压缩对象的大小,只需将其添加到当前大小即可。我认为这是一个替代方案,而不是每次需要时都只计算整个尺寸 要了解单个对象的大小,可以使用: 这种技术基本上是在创建对象之前和创建对象之后使用:Runtime.getRuntime().totalMemory()获取内存 还有其

我有一个存储压缩数据的自定义集合

如何轻松获取集合的大小(KB或MB)


我想看看我的数据存储的效率,以及压缩对某些数据的影响。

也许最简单的方法是计算添加或删除收藏中的项目时所消耗的内存量(对象大小),此时您可能需要计算放入收藏中的压缩对象的大小,只需将其添加到当前大小即可。我认为这是一个替代方案,而不是每次需要时都只计算整个尺寸

要了解单个对象的大小,可以使用:

这种技术基本上是在创建对象之前和创建对象之后使用:Runtime.getRuntime().totalMemory()获取内存


还有其他技巧。

快速而肮脏的答案是:




    public static void main(final String[] args) {
            System.out.println("Before: " + getUsedMem());
            final byte[] bb = new byte[30 * 1024 * 1024]; // 30 MB
            System.out.println("After: " + getUsedMem());
        }

        private static String getUsedMem() {
            final long mem = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
            return (mem / 1024) + "KB";
        }

但是,请记住,由于其垃圾收集器、多线程体系结构等原因,这些数字并不精确。 特别是如果您同时运行GUI。
如果您坚持使用一个非常简单的程序,没有静态初始值设定项,也没有垃圾收集器启动的机会,那么您可能会得到非常准确的结果。

除非您有一个像
字节[]
数组这样的琐碎数据结构,并且您对对象的轻微开销不感兴趣,进行内存转储并在其上运行一些分析器。您是否将压缩数据存储在字节数组、文件系统或某个自定义对象中?@11thdimension我还没有得到压缩(zip、7zip等)部分,但根据我对它的研究,它将是字节数组,因为它将在内存中。@Paul,asnwer accepted there没有给出内存的实际大小,但给出了引用变量的大小,另外,如果序列化对象大小与其他人建议的对象大小相同,则也有疑问。然而,考虑到数据的压缩性质,如果存储在字节数组或流中,内存大小可能已经存在。@Blankman,如果您决定将数据存储在字节数组中,那么字节数组本身的长度将是内存中的大小,至少对于与您的程序最相关的部分而言是如此。假设在压缩之前需要1000字节数组,压缩之后需要50字节数组。