使用的Java内存
我试图找出地图消耗的内存量。所以,我做了以下几件事-使用的Java内存,java,memory,hashmap,jvm,Java,Memory,Hashmap,Jvm,我试图找出地图消耗的内存量。所以,我做了以下几件事- Map<String,Double> cr = crPair.collectAsMap(); // 200+ entries System.out.println("free memory = " + Runtime.getRuntime().freeMemory()); Map<String,Double> gen = new HashMap<>(); gen.putAll(cr); System.out
Map<String,Double> cr = crPair.collectAsMap(); // 200+ entries
System.out.println("free memory = " + Runtime.getRuntime().freeMemory());
Map<String,Double> gen = new HashMap<>();
gen.putAll(cr);
System.out.println("free memory = " + Runtime.getRuntime().freeMemory());
我基本上是想看看我的地图在超过某个特定阈值之前可以支持多少条目。然而,这并不意味着有额外的字节。我错过了什么?此外,任何人都可以粗略估计hashmap占用的空间量(1000个条目的顺序)。
运行时。freeMemory
仅返回粗略估计。它不适合测量给定对象占用的内存
您可以与内置的-prof gc
分析器一起使用,以获得更准确的估计。下面是一个示例基准测试,用于测量HashMap占用的空间(不计算键和值本身使用的内存)
也就是说,在启用CompressedOops的JDK 8 x64上,1000个元素的HashMap大约需要40KB
或者,您可以进行完全堆转储:
jmap -dump:format=b,file=heap.hprof <pid>
jmap-dump:format=b,file=heap.hprof
并对其进行分析。此工具可以显示任何给定对象或对象图形占用的内存。首先,有一个专门的工具用于测量这些对象,称为 玩起来很容易,它会给你一些很好的输入,例如:
HashMap<String, String> map = new HashMap<>(8);
map.put("key", "value");
for (int i = 0; i < 2_000; i++) {
map.put("key" + i, "value");
}
System.out.println(GraphLayout.parseInstance(map).totalSize());
HashMap-map=新的HashMap(8);
地图放置(“键”、“值”);
对于(int i=0;i<2_000;i++){
映射放置(“键”+i,“值”);
}
System.out.println(GraphLayout.parseInstance(map.totalSize());
也
Benchmark (size) Mode Cnt Score Error Units
MapSizeBench.hashMap:·gc.alloc.rate.norm 10 avgt 5 448,000 ± 0,001 B/op
MapSizeBench.hashMap:·gc.alloc.rate.norm 100 avgt 5 4288,001 ± 0,001 B/op
MapSizeBench.hashMap:·gc.alloc.rate.norm 1000 avgt 5 40256,009 ± 0,002 B/op
MapSizeBench.hashMap:·gc.alloc.rate.norm 10000 avgt 5 385640,093 ± 0,017 B/op
MapSizeBench.hashMap:·gc.alloc.rate.norm 100000 avgt 5 4248681,606 ± 0,329 B/op
jmap -dump:format=b,file=heap.hprof <pid>
HashMap<String, String> map = new HashMap<>(8);
map.put("key", "value");
for (int i = 0; i < 2_000; i++) {
map.put("key" + i, "value");
}
System.out.println(GraphLayout.parseInstance(map).totalSize());