2015-08-13 30 views
0

我想知道下面的代码片段的内存使用含义。我的理解是,每个内存中只有一个实例会存储在内存中,而第二个缓存中的每一个实例都只会创建一个指针。如果创建一个指针需要占用多少空间?有没有什么方法可以监视下面例子中的JVM和内存使用情况?是否有必要实习uid?任何建议在下面将不胜感激。Biderectional缓存的内存使用含义

//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); 
} 

回答

1

一个对象引用发生在一个64位JVM至多8个字节,但由于CompressedOops 4个字节。由于您只有100000个对象,因此地图引用将占用4 * 4 * 100000 = 1,6MB的内存。地图内容将会达到100,000 *(sizeof(UUID)+ sizeof(Long)),它仍然在几十兆字节。

实习可以帮助完成相同的字符串,其中U位于UUID之一,可以告诉您为什么这对您没有任何帮助。并不是说你真的需要帮助。一张100k条目的小地图不需要特别关注。

+0

谢谢您的确认。确实,实习生在给定的片段中没有用处。这是被提及的,因为如果缓存进一步扩展。根据扩展的方法,可能会创建一个新的字符串uid,而不是通过指针共享,我将尽量避免使用它。 –

0

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

对于cache1,您可以简单地执行bimap.get(key)。对于cache2,你可以做bimap.inverse().get(key)

+1

虽然这是真的,但这并不能真正回答这个问题,并且作为评论更好。 – Kayaman

+0

感谢您的建议:)在这个时候,我只是看着代码片段,以确认我不会错过任何东西。如果你愿意,更多的是学习经验。 –