我正在使用HashMap在应用程序启动时缓存一些重要数据 此缓存有时会增长然后减少。我想知道它对RAM占用了多少内存 是否有可能以KB为单位获取地图内存?有没有API?
答案 0 :(得分:9)
我正在使用此方法估算MAP大小:
public static void size(Map map) {
try{
System.out.println("Index Size: " + map.size());
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(map);
oos.close();
System.out.println("Data Size: " + baos.size());
}catch(IOException e){
e.printStackTrace();
}
}
答案 1 :(得分:7)
有一个很好的工具用于此目的:ClassMexer
您可以通过以下方式估计HashMap的内存,包括引用的对象:
long noBytes = MemoryUtil.deepMemoryUsageOf(myCacheMap);
答案 2 :(得分:4)
当然,您意识到您的Map
包含对堆上的对象的引用,而不是对象本身。因此,在没有追逐整个参考树的情况下,询问Map
消耗多少内存以添加密钥和值的字节是没有意义的。
对象没有这样做;没有办法实现它。
就像上面所说的明智评论一样,使用所有插件获取Visual VM并分析您的应用程序。
答案 3 :(得分:3)
在没有仪器的情况下计算对象的实际大小几乎是不可能的。
有时你可以根据指针的大小,原始类型,对象的开销等来计算它,但是对于像带有内容的HashMap那样复杂的东西(实际的大小大小取决于它的历史和哈希因子和其所有元素的hascode以模数哈希因子为模型几乎是不可能的。
唯一真正的解决方案是使用堆分析器,例如Eclipse Mat。
答案 4 :(得分:1)
这在很大程度上取决于您的JVM供应商和版本。您可以查看this presentation进行粗略估算。