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

标签 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.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();
            }
        }
    }

我得到的结果是:

memory before =    76083464
memory after    =  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 以大块的方式请求内存效率更高。当它获得的内存多于当前分配所需的内存时,总内存和空闲内存都会增加。

关于java - 为什么 Runtime.freeMemory() 在构造对象后显示更多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31103707/

相关文章:

objective-c - 使用@autoreleasepools 的正确方法?

c++ - 如何知道分配给定内存块的是什么?

java - 设置特殊正则表达式的长度

linux - Golang os/exec,实时内存使用

objective-c - 释放按引用返回的 NSString 会导致崩溃

ios - 如何告诉用户你的 iOS 应用程序需要多少内存

java.lang.outofmemoryError java 内存不足错误

java - 使用 CSVWriter 导出带有 BLOB 的数据库表

java - 如何将值从 Activity 类传递到 android 中的 java 类?

java - 从 String Android 创建 Json 对象