Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用的Java内存_Java_Memory_Hashmap_Jvm - Fatal编程技术网

使用的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());