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

Java 为什么Runtime.freemory()在构造对象后显示更多内存?,java,memory,memory-management,profiler,Java,Memory,Memory Management,Profiler,我试图在没有分析器的情况下计算内存中hashmap的大小。因此,我做了以下工作: HashMap<Integer, String> map = new HashMap<Integer, String>(); long start = System.currentTimeMillis(); lotsOfGC(); long freeMemoryBeforeConstruction = Runtime.getRuntime().freeMemory(); System.out

我试图在没有分析器的情况下计算内存中hashmap的大小。因此,我做了以下工作:

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 );
我得到的结果是:

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

有人能给我解释一下为什么创建hashmap后的空闲内存会更大吗

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

memory before        =  76083464  
total memory before  =  96468992  
memory after         = 735235264  
total memory after   = 755367936

当前分配的内存就是差异所在

Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()

分配一个对象,特别是一个大对象,可能需要JVM从操作系统获得额外的内存。这是一个相对昂贵的操作,因此JVM请求大块内存的效率更高。当它获得的内存超过当前分配所需时,总内存和可用内存都将增加

每次都是这样?你能确认吗?@RamanShrivastava:是的,在这个小程序的每次运行中,
Runtime.getRuntime().totalMemory()
表现如何?通常,在用内存是空闲内存和总内存之间的差值。分配一个对象可能会触发获取更多内存,使总内存增加超过对象的大小。@MouseEvent-确定吗?再次检查:)显示您运行的完整程序。特别是,什么是
数字
?还有什么会占用空间呢?这会和Debug.getMemoryInfo()不同吗?@IgorGanapolsky我不知道。类
Debug
在哪个包中?@IgorGanapolsky在那种情况下,我肯定不知道。
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()