【问题标题】:Calculate memory of a Map Entry计算地图条目的内存
【发布时间】:2013-12-08 20:11:45
【问题描述】:

我有一个 Map(String, String),我想找到一个 Entry 和 Map 的总内存大小。我在某处读到 Instrumentation 可能有用 (Instrumentation)。有人有想法吗?

提前致谢。

【问题讨论】:

  • 你可以用仪器做很多事情,但你的主要目标是什么?分析器可以告诉您地图占用了多少内存。您的地图条目是什么?
  • 键和值都是字符串。主要目的是计算应用程序运行时Map对象的内存消耗。
  • 我对各种地图类型的每个项目的相对消耗很感兴趣,因此我可以在速度与内存之间进行权衡。每种映射类型都有不同的每值开销。即:哈希映射的每个值的用途与 TreeMap 或元素数组 [key,value,key,value, ...] 的最小内存二进制搜索不同。

标签: java dictionary


【解决方案1】:

java.util.AbstractMap.SimpleEntry 的空白实例对于 64 位 JVM 应该是 24 字节,对于 32 位 JVM 应该是 12 字节。这是@PeterLawrey 的一项技术,我发现它很有用,基于MemoryUsageExamplesTest

System.out.printf("The average memory used by simple entry is %.1f bytes%n", new SizeofUtil() {
    @Override
    protected int create() {
        Map.Entry<String, String> e = new AbstractMap.SimpleEntry<String, String>(null, null);
        return 1;
    }
}.averageBytes());

【讨论】:

    【解决方案2】:

    使用 ObjectOutputStream 将对象写入 ByteArrayOutputstream 并检查结果字节数组的长度。

    显然您的 Map.Entry 需要实现 Serializable。

    public int getSizeInBytes(Serializable someObject) {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream objectOut = new ObjectOutputStream(byteOut);
        objectOut.writeObject(someObject);
        objectOut.flush();
        return byteOut.toByteArray().length;
    }
    
    public int getSizeBits(Serializable someObject) {
        return getSizeInBytes(someObject) * 8;
    }
    

    【讨论】:

    • 感谢您的建议。这是另一种可能的解决方案。我将尝试将答案与上面提供的解决方案进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多