为什么强制垃圾收集会增加分配给 java 进程的内存?

Why forcing Garbage Collection increases the memory allocated to java process?

所以我有这个代码:

public static void main(String[] args) throws Exception {
    Thread.sleep(5000);
    System.out.println("Creating array...");
    Integer[] integers = new Integer[Integer.MAX_VALUE/32];
    Thread.sleep(5000);
    System.out.println("Destroying array");
    integers = null;
    //System.gc ();
    //System.runFinalization ();
    Thread.sleep(60000);
}

当我 运行 这段代码时,大约 5 秒后,我将看到 268 MB 的 ram 分配给 Activity 监视器中的 java 进程。

当我在控制台中看到 "Destroying array" 后 取消注释 注释行(System.gc 和下一行)时,分配的内存增加到 278 MB .

我能理解内存没有释放,因为System.gc()只是给JVM的提示,但为什么增加了10MB?此时加载到内存中的是什么?

分配的内存并不一定意味着对象占用的内存。可以是空堆space.

Java GC 是 copying/compacting 收集器,为了复制工作,他们需要一些 TO-space 作为非垃圾的复制目的地。

并且通过强制垃圾收集,您会干扰 GC 的启发式算法,例如及其暂停时间目标或吞吐量目标。作为补偿,它可能决定给自己更多的喘息空间——在配置的最大堆大小的范围内——以仍然满足这些目标。

我不知道它是否适用于所有 GC 算法,但使用 -XX:+PrintAdaptiveSizePolicy 记录可能会提供一些见解。

您提出的问题无效。

您不能强制执行 GC,而且任何内存消耗都完全是一个实现细节。 JVM 可以做很多事情,所以这个问题完全无效。

在不同的机器和 JVM 上,它的行为可能不同。