在内存上获取地图大小(RAM)

时间:2012-07-04 13:20:40

标签: java memory map

我正在使用HashMap在应用程序启动时缓存一些重要数据 此缓存有时会增长然后减少。我想知道它对RAM占用了多少内存 是否有可能以KB为单位获取地图内存?有没有API?

5 个答案:

答案 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进行粗略估算。