【问题标题】:Memory usage implications of biderectional caching双向缓存的内存使用影响
【发布时间】:2015-11-06 01:58:52
【问题描述】:

我想知道以下代码 sn-p 对内存使用的影响。我的理解是,每个实例只有一个实例将存储在内存中,而对第二个缓存的每次添加都只是创建一个指针。如果创建指针,会消耗多少空间?对于以下示例,有什么方法可以监控 JVM 和内存使用情况?是否有必要实习uid?任何关于以下内容的建议将不胜感激。

//Bidirectional Cache
HashMap<String, Long> cache1 = new HashMap<String, Long>();
HashMap<Long, String> cache2 = new HashMap<Long, String>();

//Some Random Test Data
for(int i = 0; i < 100000; i++){
    Long id = new Long(i);
    String uid = UUID.randomUUID().toString();

    cache1.put(uid, id);
    cache2.put(id , uid);
}

【问题讨论】:

    标签: java pointers caching memory


    【解决方案1】:

    在 64 位 JVM 上,对象引用最多占用 8 个字节,但感谢CompressedOops 4 个字节。由于您只有 100000 个对象,因此映射引用将占用 4*4*100000 = 1.6MB 内存。地图内容将占用 100,000*(sizeof(UUID)+sizeof(Long)) 仍然在几十兆字节。

    实习有助于处理相同的字符串,UUID 中的 Us 之一告诉您为什么这对您没有帮助。并不是说你真的需要帮助。 100k 条目的小地图不需要特别注意。

    【讨论】:

    • 感谢您的确认。实际上,实习生在给定的 sn-p 中没有用。之所以提到这一点,是因为如果缓存进一步扩展。根据扩展方法,可能会创建一个新的字符串 uid,但不会通过指针共享,我当然会尽量避免。
    【解决方案2】:

    您可以考虑使用双向地图 API,而不是自己维护两个地图。比如看一下Guava提供的BiMap接口。使用 BiMap 的优点是:它将保留其值的唯一性以及其键的唯一性。

    对于cache1,你可以简单地做一个bimap.get(key)。对于缓存 2,您可以使用 bimap.inverse().get(key)

    【讨论】:

    • 虽然这是真的,但这并不能真正回答问题,最好作为评论。
    • 感谢您的建议 :) 此时我只是查看代码 sn-p 以确认我没有遗漏任何内容。如果您愿意,可以提供更多的学习体验。
    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2012-09-16
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多