我试图在没有探查器的情况下计算内存中散列图的大小。所以我做了以下事情:
HashMap<Integer, String> map = new HashMap<Integer, String>();
long start = System.currentTimeMillis();
lotsOfGC();
long freeMemoryBeforeConstruction = Runtime.getRuntime().freeMemory();
System.out.println("memory before = " + freeMemoryBeforeConstruction);
for(int i = 0; i < numbers.length; i++) {
String value = "value"+ i;
map.put(i, value);
}
long end = System.currentTimeMillis();
lotsOfGC();
long freeMemoryAfterConstruction = Runtime.getRuntime().freeMemory();
System.out.println("memory after= " + freeMemoryAfterConstruction );
lotsOfGC
只是:
static void lotsOfGC() {
for (int i = 0; i < 20; i++) {
System.gc();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
我得到的结果是:
内存= 76083464之前 记忆= 722062528之后
有人可以向我解释为什么创建hashmap后的可用内存更大?
更新 在阅读@Patricia Shanahan的评论后,我使用了总记忆并得到了:
memory before = 76083464
total memory before = 96468992
memory after = 735235264
total memory after = 755367936
答案 0 :(得分:4)
当前分配的内存是差异
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()
分配对象(尤其是大对象)可能需要JVM从操作系统获取额外的内存。这是一个相对昂贵的操作,因此JVM以大块的形式请求内存效率更高。当它获得的内存超过当前分配所需的内存时,总内存和可用内存都将增加。