为什么在构造对象后Runtime.freeMemory()会显示更多内存?

Jim*_*Jim 5 java memory profiler memory-management

我试图找出没有探查器的内存中哈希图的大小。所以我做了以下事情:

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 );
Run Code Online (Sandbox Code Playgroud)

lotsOfGC只是在哪里:

static void lotsOfGC() {
        for (int i = 0; i < 20; i++) {
            System.gc();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

之前的
内存= 76083464 后面的内存= 722062528

有人可以向我解释为什么创建哈希图的可用内存更大吗?

更新: 阅读@Patricia Shanahan的评论后,我使用了总内存并得到:

memory before        =  76083464  
total memory before  =  96468992  
memory after         = 735235264  
total memory after   = 755367936
Run Code Online (Sandbox Code Playgroud)

Pat*_*han 5

当前分配的内存是差异

Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()
Run Code Online (Sandbox Code Playgroud)

分配一个对象(尤其是大对象)可能需要JVM从操作系统中获取其他内存。这是一个相对昂贵的操作,因此对于JVM请求大块的内存来说,效率更高。当它获得的内存超过当前分配的要求时,总内存和可用内存都会增加。